رمزنگاری شامل تمام ابزارها و تکنیک هایی است که به محافظت از داده ها در حال انتقال و در حالت استراحت کمک می کند. فرض کنید یک فایل مهم برای ارسال دارید و می خواهید مطمئن شوید که فایل شما به صورت یکپارچه و بدون هیچ تغییری به دست مخاطبتان می رسد. ممکن است بخواهید روش هایی مانند ارسال فایل برای چندین بار یا تماس با مخاطب برای چک کردن فایل را انجام دهید. اما روش بهتر و مطمئن تری برای این کار وجود دارد و آن هم استفاده از تابع هش می باشد. هش یک تابع ریاضی است که در این مقاله با آن آشنا خواهیم شد.
هشینگ فرایندی است که ورودی های دلخواه را به خروجی هایی با اندازه ثابت تبدیل می کند. الگوریتمی که این کار را انجام می دهد Hash Function نام دارد. درست است که تابع هش کاربرد زیادی در دنیای رمزنگاری دارد اما باید بدانیم که تمام توابع هش مخصوص رمزنگاری نیستند. تابع هش یا توابع Hash الگوریتم های ریاضی هستند که داده ها را با اندازه و طول متغیر دریافت می کنند و به خروجی یکسان و قطعی تبدیلشان می کنند. توابع Hash رکن اصلی فرایند هشینگ هستند.به عبارتی دیگر، می توان گفت تابع Hash یک رشته کد با طول متناوب را دریافت و تبدیل به یک خروجی با طول ثابت می کند. تابع هش یا تابع درهم ساز را می توان یکی از اصلی ترین ابزارهای اینترنت امن دانست. توابع هش از علوم رایانه ای مهم و پرکاربرد هستند که این روزها در دنیای رمزارز نیز بسیار کارایی دارند. ورودی تابع هش یک مقدار با طول نامعلوم است، اما خروجی همیشه طول ثابتی دارد. توابع هش به شدت کاربردی هستند و تقریبا در همه کاربرد های امنیت اطلاعات حضور دارند.
توابع هش رمزنگاری به طور گسترده در فناوری بلاک چین استفاده می شوند. اصطلاح تابع هش ممکن است کمی ترسناک به نظر برسد، اما درک آن کار بسیار راحتی است. تابع هش رمزنگاری فقط یک معادله ی ریاضی است، درست مانند توابعی که در دبیرستان یادگرفته اید، مثل تابع خطی که به شکل y=mX+b نوشته می شود. تابع هش رمزنگاری هم تا حدودی مشابه این موضوع است. در واقع تابع هش یک فرمول با مجموعه ای از ویژگی های خاص است که آن را برای رمزگذاری مفید می کند. توابع هش یک ورودی دریافت می کنند و یک خروجی با طول ثابت ایجاد می کنند، مقدار خروجی خلاصه ای از داده های ورودی است. تابع هش به گونه ای طراحی شده است که یک تابع یک طرفه باشد و وارونه کردن آن غیر ممکن باشد. با این حال، در سال های اخیر چندین الگوریتم هش به خطر افتاده اند.
همانطور که گفته شد تابع هش یک رشته کد با طول متناوب را دریافت و تبدیل به یک خروجی با طول ثابت می کند. با این وجود ویژگی های اصلی تابع هش میبایست بصورت زیر باشند:
1. محاسبه مقدار هش باید برای هر نوع داده سریع باشد.
2. مقدار هش معمولاً بسیار کوچک تر از ورودی است. به همین خاطر به تابع هش، فشرده ساز نیز می گویند.
3. دستیابی به مقدار ورودی، از مقدار خروجی باید غیرممکن باشد.
4. عملکرد تابع هش با رمزنگاری متفاوت است ولی مقدار هش همیشه ثابت است.
5. هیچ دو داده ورودی متفاوت مقدار هش یکسانی را ایجاد نمی کنند. اگر آن ها مطابقت داشته باشند، باعث می شود که به عنوان یک برخورد شناخته شوند، به این معنی که الگوریتم برای استفاده ایمن نیست و در برابر حملات آسیب پذیر است.
6. یافتن دو خروجی یکسان حتی به تصادف، باید غیرممکن باشد و هر کوچک ترین تغییر حتی یک کاراکتر در ورودی، باید مقدارخروجی را تغییر دهد.
توابع هش رمزنگاری به طور گسترده در فناوری اطلاعات استفاده می شوند. ما می توانیم از آنها برای امضای دیجیتال و انواع احراز هویت استفاده کنیم. همچنین می توانیم از آن ها برای ایندکس کردن داده ها در جداول هش، برای انگشت نگاری، شناسایی فایل ها، شناسایی موارد تکراری و همچنین اطلاع از اینکه فایل ارسالی به طور تصادفی یا عمدی دچار آسیب نشده باشد، استفاده کنیم. ما همچنین می توانیم از آنها برای ذخیره ی رمز عبور استفاده کنیم.
بطورکلی تابع هش قوی باید قطعیت یا Determinism و مقاومت در برابر تصویر اولیه و پردازش نشده یا Pre-Image Resistance و مقاومت در برابر برخورد یا Collision Resistance و اثر بهمن یا سقوط ناگهانی یا Avalanche Effect و محاسبات سریع یا Computationally Efficient و خروجی غیر قابل معکوس یا Impossible To Reverse Engineer را داشته باشد تا قابلیت مورد نیاز متخصصین را تامین نماید. تابع هش در صورتی که این موارد را رعایت نماید میتواند کاربرد های زیر را داشته باشد:
• ذخیره کلمه عبور
یکی از کاربردهای اصلی این الگوریتم ها، ذخیره ی رمزهای عبور در بستر وب است. تابع Hash پسوردها را به طور شفاف ذخیره نمی کند و آن ها را به صورت یک فرمول هش ذخیره و ثبت می کند. هکرها هنگام حمله به سیستم فقط می توانند خروجی هش را به دست آورند که با توجه به توضیحی که کمی قبل تر در رابطه با یک طرفه بودن عملیات هشینگ دادیم؛ به دست آوردن ورودی از طریق مقدار Hash غیر ممکن است. در نتیجه ذخیره پسورد از این روش امنیت بالایی دارد. به جای ذخیره رمز عبور به صورت شفاف، تمام فرآیندهای لاگین کردن، تنها هش رمز عبور را در یک فایل ذخیره می کنند. یک نفوذ کننده تنها می تواند هش پسورد ها را ببیند. بنابراین نه می تواند توسط این هش ها وارد شود نه از طریق آن ها کلمه های عبور را بدست آورد. دلیل آن یک طرفه بودن تابع هش است.
• تولید و تایید امضا
تأیید امضاها یک فرآیند ریاضی است که برای تأیید صحت پیام ها یا اسناد دیجیتال استفاده می شود. یک امضای دیجیتال معتبر، به گیرنده ی پیام این اطمینان را می دهد که پیام توسط یک فرستنده آشنا، ارسال شده و همچنین در حین انتقال تغییری نکرده است. یک طرح از امضای دیجیتال، معمولا از سه الگوریتم تشکیل می شود: الگوریتم تولید کلید یاkey generation، الگوریتم امضا که با دادن یک پیام و یک کلید خصوصی، امضا تولید می کند یا produces a signature که یک الگوریتم تایید امضا ایجاد می نماید. حال Merkle Trees که فناوری مورد استفاده در ارزهای دیجیتال است، نوعی امضای دیجیتال محسوب می شود.
• حفظ امنیت
توابع هش در حفظ امنیت شبکه های بلاک چین و فضای کریپتوکارنسی جایگاه مهم و اساسی دارند. فرایند رمزنگاری در بلاک چین ها از طریق این الگوریتم ها انجام می شود. داده های موجود روی هر بلاک از طریق فرایند هشینگ به یک رشته کد تبدیل می شوند و به زنجیره ی اصلی می پیوندند.
• بررسی یکپارچه بودن فایل یا پیام
از هش ها می توان برای اطمینان از عدم دستکاری پیام ها و فایل ها، در حین انتقال استفاده کرد. این عمل یک زنجیره ی اعتماد ایجاد می کند. به عنوان مثال، یک کاربر ممکن است یک نسخه ی هش شده از داده های خود را منتشر کند تا گیرندگان بتوانند مقدار خروجی خود را با مقدار منتشر شده مقایسه کنند و مطمئن شوند که هم تراز هستند.
• بررسی صحت داده
یکی دیگر از کاربردهای الگوریتم های هش، تولید چک سام یا CheckSum بر روی فایل هاست. چک سام، به کاربران تضمین صحت داده می دهد و به آن ها کمک می کند تا هر تغییری را بر روی فایل ها سریعاً متوجه شوند. اما این سیستم در مورد اصالت فایل تضمینی نمی دهد و هکرها می توانند با تغییر کلی فایل، Hash جدید تولید و از این طریق به داده های فایل دسترسی پیدا کنند.
توابع هش با توجه به سبک ساز و کارشان خروجی هایی با اندازه های متفاوت تولید می کنند؛ اما اندازه ی خروجی یک نوع خاص از تابع Hash همیشه یکسان است. هشِ هر بلاک جدید به هشِ بلاک قبل از آن اشاره می کند. این سیستم از هش ها تضمین می کند که هیچ تراکنشی در گذشته قابل تغییر نباشد. چون اگر یک قسمت از تراکنش تغییر کند، هش همان بلاک نیز تغییر می کند و در نتیجه هش های بلاک های بعد از آن نیز تغییر خواهند کرد. در نهایت تشخیص تراکنش های دستکاری شده، بسیار ساده خواهد بود. زیرا برای این کار تنها نیاز دارید تا هش ها را با یکدیگر مقایسه کنید.
الگوریتم هش، داده های ورودی بزرگ را به بلوک هایی با اندازه مساوی تقسیم می کند. سپس الگوریتم فرآیند هش را برای هر بلوک داده به طور جداگانه اعمال می کند. اگرچه یک بلوک به صورت جداگانه هش می شود، اما همه بلوک ها به هم مرتبط هستند. مقدار هش بلوک داده اول یک مقدار ورودی در نظر گرفته می شود و به بلوک داده دوم اضافه می شود. به همین ترتیب، خروجی هش شده بلوک دوم با بلوک سوم جمع می شود و مقدار ورودی ترکیبی دوباره هش می شود و به همین ترتیب، چرخه ادامه می یابد تا زمانی که خروجی نهایی را دریافت کنید که مقدار ترکیبی همه بلوک هایی است که درگیر بودند. این بدان معناست که اگر داده های هر بلوکی دست کاری شود، مقدار هش آن تغییر می کند و ازآنجایی که مقدار هش آن به عنوان ورودی به بلوک های بعدی وارد می شود، همه مقادیر هش تغییر می کنند. به این ترتیب است که حتی کوچک ترین تغییر در داده های ورودی قابل تشخیص است زیرا کل مقدار هش را تغییر می دهد. در این راستا بهتر است با انواع الگوریتم های توابع هش آشتا شویم:
1. Message Digest یا MD : قبل از هر چیزی باید بگوییم که MD5 برای چندین سال محبوب ترین و پرکاربردترین تابع هش بود، اما اکنون کاملا منقرض شده است. MD5 یکی از اولین الگوریتم هایی است که مورد تایید گسترده قرار گرفته بود. MD5 در سال 1991 طراحی شد و در آن زمان به طور قابل توجهی ایمن در نظر گرفته می شد، اما با گذشت زمان هکرها نحوه رمزگشایی این الگوریتم را کشف کردند و اکنون می توانند در عرض چند ثانیه این الگوریتم را رمزگشایی کنند.
2. الگوریتم SHA-1 : این الگوریتم می تواند از ورودی با طول های مختلف استفاده کند و سپس یک پیام ۱۶۰ بیتی تولید کرده و پیام ها را در بلاک هایی به اندازه ۵۱۲ بیت پردازش کند. اگر طول پیام ضریبی از ۵۱۲ بیت نباشد، الگوریتم SHA می تواند طول پیام را تغییر دهد تا به نزدیک ترین ضریب ۵۱۲ بیت برسد.
3. الگوریتم SHA-2 : در حال حاضر یکی از الگوریتم های محبوب در جامعه رمزنگاری است، هرچند همانند الگوریتم SHA-1 دارای نقاط ضعف خاصی است. الگوریتم SHA-2 پس از معرفی در سال ۲۰۰۱ دستخوش تغییراتی چشمگیر شده و ۴ نسخه مختلف از آن عرضه شده است. این ۴ نسخه SHA-256 و SHA-224 و SHA-512 و SHA-384 میباشند.
4. الگوریتم SHA-256 : این الگوریتم می تواند از طریق اندازه بلاک ۵۱۲ بیت، دایجست پیام ۲۵۶ بیت ایجاد کند، در حالی که الگوریتم SHA-224 از نسخه کوتاه تر SHA-256 بهره می برد و با استفاده از اندازه بلاک ۵۱۲ بیت می تواند دایجست پیام ۲۲۴ بیت تولید کند.
5. الگوریتم SHA-3 : جدیدترین نسخه الگوریتم های هشینگ ایمن به شمار می آیند که اهمیت هشینگ در بلاک چین را نشان می دهند. SHA-3 درسال ۲۰۱۵ عرضه شده و همانند استاندارد الگوریتم MD5 است. SHA-3 قابلیت این را دارد تا به عنوان جایگزینی برای SHA-2 عمل کند، در حالی که نسخه ها و طول هش آن مشابه با SHA-2 است. تنها تفاوت این دو الگوریتم این است که SHA-3 امنیت بهتری ارائه می دهد.
6. الگوریتم RIPEMD : ریپمد مخفف عبارت RACE Integrity Primitives Evaluation Message Digest است. این مجموعه ای از توابع هش است که به طور کلی به عنوان خانواده ای از توابع هش اروپایی شناخته می شود. این مجموعه شامل RIPEMD، RIPEMD-128 و RIPEMD-160 می باشد. همچنین نسخه های 256 و 320 بیتی این الگوریتم نیز وجود دارد. RIPEMD اصلی بر اساس اصول طراحی استفاده شده در MD4 طراحی شده است. RIPEMD-160 نسخه بهبود یافته و پرکاربردترین نسخه در خانواده است. نسخه های 256 و 320 بیتی احتمال برخورد تصادفی را کاهش می دهند، اما در مقایسه با RIPEMD-128 و RIPEMD-160 از سطوح امنیتی بالاتری برخوردار نیستند.
7. الگوریتم Whirlpool : یکی از توابع هش رمزنگاری است که در سال 2000، طراحان این الگوریتم را بر اساس استاندارد رمزگذاری پیشرفته ایجاد کردند و بسیار امن در نظر گرفته می شود. تا به حال سه نسخه از الگوریتم Whirlpool منتشر شده است که WHIRLPOOL-0 و WHIRLPOOL-T و WHIRLPOOL میباشند.
8. الگوریتم Blake : تابع هش Blake جزو ۵ الگوریتم برتر به انتخاب مؤسسه ملی استاندارد و فناوری ایالات متحده (NIST) است. این الگوریتم همانند SHA-2، از ۲ تابع مختلف تشکیل شده است. یکی از کلمات ۳۲ بیتی استفاده می کند و طول هش محاسبه شده ی آن حداکثر ۲۵۶ بیت است، دیگری از کلمات ۶۴ بیتی استفاده می کند با طول Hash ۵۱۲ بیت.
درست مانند سایر فناوری ها و فرآیندها، توابع هش در رمزنگاری نیز کامل نیستند. درگذشته، مواردی وجود داشت که الگوریتم های محبوبی مانند MD5 و SHA-1 مقدار هش یکسانی را برای داده های مختلف تولید می کردند. ازاین رو، کیفیت مقاومت در برابر برخورد به خطر افتاد. یک فناوری به نام rainbow tables وجود دارد که هکرها از آن برای شکستن مقادیر هش استفاده می کنند. برخی از سرویس های نرم افزاری و ابزارهای سخت افزاری وجود دارند که مهاجمان، محققان امنیتی یا حتی سازمان های دولتی از آن ها برای شکستن رمزهای عبور هش شده استفاده می کنند. برخی از انواع حملات brute force می توانند داده های هش شده را شکست دهند. حال درانتها میبایست خاطر نشان شد که هش در واقع یک ابزار رمزنگاری بسیار مفید برای تأیید در فناوری اطلاعات است. توابع هش رمزنگاری از نظر عملکردها و کاربردها برای اهداف خاص متفاوت است. درحالی که توابع هش رمزنگاری کامل نیستند، به عنوان جمع های چک و مکانیسم های احراز هویت عالی عمل می کنند.