تابع در هم سازی در اصل یک تابع ریاضی است که عدد ورودی را به یک عدد دیگر به صورت فشرده شده تبدیل میکند. در حوزه امنیت و رمزنگاری، این توابع یکی از موارد کاربردی و پراهمیت هستند که در اغلب اپلیکیشنهای امنیتی به کار گرفته میشوند. در حوزه امنیت و رمزنگاری، تابع در هم سازی یا Hash Function یکی از موارد کاربردی و پراهمیت است که در اغلب اپلیکیشنهای امنیتی به کار گرفته میشود. از این رو در این مطلب قصد داریم تا اطلاعات کاملی دربارهی هش فانکشن ارائه دهیم.
تابع هش یا Hash Function چیست؟
تابع در هم سازی در اصل یک تابع ریاضی (به صورت h(x)) است که عدد ورودی را به یک عدد دیگر به صورت فشرده شده تبدیل میکند. نکتهی مهم در خصوص تابع هش این است که ورودی تابع میتواند هر اندازهای داشته باشد اما خروجی تابع همواره یک اندازه مشخص دارد. این خروجی حاصل از هش فانکشن را message digest یا hash Value مینامیم. در تصویر زیر به صورت black box یک هش فانکشن را میبینیم.
ویژگیهای Hash Function
تابع هش ویژگیهای خاصی دارد که به عنوان مهمترین ویژگی باید به طول ثابت خروجی آن اشاره کنیم. درواقع همانطور که پیشتر اشاره کردیم، یک تابع هش داده با هر میزان طول ورودی را به یک خروجی با طول ثابت تبدیل میکند و درواقع همین عملیات است که با نام هش کردن داده شناخته میشود. ویژگی دیگر تابع هش این است که به صورت کلی دادهی خروجی به مراتب کوچکتر از دادهی خروجی است. همین موضوع باعث شده است که از هش فانکشن گاهی اوقات با نام compression function یاد کنیم. در اینجا باید اشاره کنیم که تابع هش که دارای خروجی n بیتی است را با n-bit hash function میشناسیم که در حال حاضر معروفترین توابع هش 160 و 512 بیت خروجی دارند.
ویژگی دیگر تابع هش، سرعت بالای آنهاست. درواقع تابع هش از هر نوعی با هر طول ورودی، در برابر رمزنگاری متقارن، به مراتب سریعتر هستند.
چه انتظاراتی از تابع هش داریم؟
برای اینکه hash function بتواند به عنوان یک ابزار رمزنگاری قدرتمند عمل کند، باید خاصیتها و قابلیتهایی را داشته باشد که در ادامه به بررسی هر یک میپردازیم.
1- Pre-Image Resistance
در این ویژگی عملاً انتظار داریم که از نظر محاسباتی، معکوس کردن هش فانکشن سخت باشد. به عبارتی انتظار داریم که اگر مقدار خروجی تابع هش Z باشد، عملاً امکان بدست آوردن ورودی X که با اعمال تابع هش، خروجی Z ایجاد شده، ممکن نباشد.
2- Second Pre-Image Resistance
این ویژگی به این معناست که اگر یک ورودی مانند x و مقدار هش آن به صورت h(x) را در دسترس داشته باشم، پیدا کردن یک مقدار مثل y به طوری که h(y) با h(x) یکی شود، سخت باشد. درواقع باید به ازای یک ورودی و مقدار هش آن، پیدا کردن یک ورودی دیگر که همان هش را میسازد، سخت باشد.
3- Collision Resistance
این ویژگی که collision free hash function هم نامیده میشود، این موضوع را بیان میکند که پیدا کردن دو ورودی با هر طولی که هش یکسانی را ایجاد کنند، سخت باشد.
از آنجایی که هش فانکشن عملاً یک تابع فشرده سازی هست که خروجی با طول ثابت دارد، تقریباً غیرممکن است که دچار collision نشویم. پس نمیتوانیم انتظار داشته باشیم که هیچ collisionی رخ ندهد اما انتظار داریم که پیدا کردن این collision سخت باشد.
باید اشاره کنیم که اگر یک تابع هش Collision Resistance باشد، عملاً Second Pre-Image Resistance هم هست.
مشهورترین توابع هش
MD5
به عنوان مشهورترین تابع هش که چندین سال مورد استفاده قرار میگرفت، خانوادهی توابع MD است که در بین اعضای این خانواده MD5 از همه معروفتر است. تابع MD5 به صورت گسترده در نرم افزارها مورد استفاده قرار میگرفت تا integrity فایلهای انتقال داده شده را تضمین کند. اما در سال 2004 مشخص شد که یک collision attack در مدت 1 ساعت میتواند امنیت این هش فانکشن را دچار مشکل کند. از این رو استفاده از MD5 دیگر توصیه نمیشود.
SHA
این خانواده شامل چهار عضو SHA-0، SHA-1، SHA-2 و SHA-3 میشود. در بین اعضای این خانواده، SHA-1 بیشترین استفاده را دارد و حتی در SSL هم به کار رفته است. SHA-2 که خودش چهار عضو بسته به تعداد بیت خروجی دارد (SHA-224, SHA-256, SHA-384, SHA-512)، یک هش فانکشن بسیار قدرتمند است که تا به امروز هیچ حملهی موفقی روی آن انجام نشده است. نهایتاً باید به SHA-3 اشاره کنیم که در سال 2012 ارائه شد که عملکرد بسیار خوبی داشته و در برابر حمله مقاومت بسیار عالی دارد.
کاربردهای تابع هش
یکی از مهمترین کاربردهای تابع هش، ذخیره رمز عبور است. درواقع به جای ذخیرهی رمزهای عبور به صورت ساده، اغلب مقدار hash value رمزهای عبور نگه داری میشود. درواقع فایل رمزهای عبور شامل یک جدول دو ستونه است که نام کاربرد و مقدار هش رمز عبور در آن نگه داری میشود.
یکی دیگر از کاربردهای تابع هش، چک کردن data integrity است. درواقع از تابع هش برای ایجاد checksum روی فایل داده استفاده میشود. با این کار کاربر میتواند به صحت دادهها اطمینان کند. درواقع با این ترفند، در صورتی که هر تغییری در پیام اصلی ایجاد شود، کاربر از آن مطلع میشود.
ارسال نظر