
تابع هش (Hash Function) یک تابع ریاضی است که یک مقدار ورودی را به مقدار فشرده شده دیگر تبدیل میکند. ورودی تابع هش یک مقدار با طول نامعلوم است؛ اما خروجی همیشه طول ثابتی دارد. توابع هش به شدت کاربردی هستند و تقریبا در همه کاربردهای امنیت اطلاعات حضور دارند.
مقدار برگشت داده شده توسط یک تابع هش، یک «پیام خلاصه» یا به طور ساده «مقدار هش» نام دارد. شکل زیر یک تابع هش را نشان میدهد.

ویژگیهای تابع هش
ویژگیهای معمول توابع هش عبارتند از:
- طول ثابت خروجی (مقدار هش)
- تابع هش، داده با طول متغیر را به طول ثابت تبدیل میکند.
- معمولا اندازه هش بسیار کوچکتر از ورودی است؛ بنابراین توابع هش را گاهی با نام توابع فشردهساز میشناسند.
- تابع هش با خروجی n بیتی، را تابع هش n-بیتی مینامند.
- اثربخشی فرآیند
- به طور کلی برای هر تابع هش h با ورودی X، محاسبه (h(x، یک عملیات سریع است.
- انجام محاسبات در توابع هش بسیار سریعتر از رمزنگاری متقارن هستند.
شرایط توابع هش
برای این که تابع هش یک ابزار موثر رمزنگاری باشد، بایستی شرایط زیر را برآورده کند:
- شرط اول
- این شرط بیان میکند که تابع هش باید یک تابع یکطرفه باشد.
- به بیان دیگر اگر یک تابع هش h یک مقدار هش z را تولید کرد، پیدا کردن یک مقدار x که هش آن با z یکی شود، بایستی فرآیند دشواری باشد.
- این خاصیت باعث محافظت از پیدا کردن مقدار ورودی هش توسط حمله کنندهای میشود که مقدار هش را در اختیار دارد.
- شرط دوم
- اگر یک ورودی و هش آن را در اختیار داشته باشیم، پیدا کردن یک ورودی متفاوت که همان مقدار هش را بدهد، بایستی دشوار باشد.
- به بیان دیگر اگر یک تابع هش h برای یک ورودی x، یک مقدار هش (h(x را بدهد، پیدا کردن مقدار ورودی دیگری که (h(y) = h(x شود، بایستی دشوار باشد.
- این ویژگی باعث میشود در برابر حمله کنندهای که یک مقدار هش ورودی و هش آن را دارد و میخواهد یک مقدار متفاوت را به عنوان مقدار ورودی اصلی جایگزین آن کند، محافظت شود.
- شرط سوم
- پیدا کردن دو ورودی متفاوت با هر طولی که منجر به یک هش مشابه شود، بایستی دشوار باشد. این ویژگی با عنوان «تابع هش بدون تصادم» نیز شناخته میشود.
- به بیان دیگر برای یک تابع هش h، پیدا کردن دو ورودی متفاوت x و y به طوری که (h(x) = h(y شود، باید دشوار باشد.
- چون تابع هش یک تابع فشردهساز با خروجی ثابت است، نداشتن تصادم برای آن غیرممکن است. این ویژگی تنها بیان میکند که پیدا کردن این تصادمها باید بسیار سخت باشد.

کاربرد توابع هش
تابع هش دو کاربرد اصلی دارد که در ادامه به توضیح آنها میپردازیم.
ذخیره رمز عبور
توابع هش در زمان ذخیرهسازی کلمات عبور، از آنها محافظت میکنند.
- به جای ذخیره رمز عبور به صورت شفاف، تمام فرآیندهای لاگین کردن، تنها هش رمز عبور را در یک فایل ذخیره میکنند.
- فایل پسورد شامل جفتهایی به شکل (id کاربر ٫ (h(p) است.
- یک نفوذ کننده تنها میتواند هش پسوردها را ببیند. بنابراین نه میتواند توسط این هشها وارد شود نه از طریق آنها کلمههای عبور را بدست آورد. دلیل آن یکطرفه بودن تابع هش است.
بررسی صحت داده
بررسی صحت داده یکی از کاربردهای بسیار رایج توابع هش است که از آن برای تولید چکسامها (CheckSum) روی دادهی فایلها استفاده میشود. این کاربرد به کاربر اطمینان میدهد که صحت داده تضمین شده است.
این فرآیند در شکل زیر به تصویر کشیده شده:

این فرآیند بررس صحت، به کاربر کمک میکند تا هر تغییر انجام شده روی فایل اصلی را متوجه شود. هر چند تضمینی در مورد اصالت فایل نمیدهد. حمله کننده به جای تغییر داده، میتواند کل فایل را تغییر دهد و هش جدید را محاسبه کرده و به دریافت کننده بفرستد. این کاربرد بررسی صحت داده، تنها زمانی مفید است که کاربرد در مورد اصالت فایل مطمئن باشد.
طراحی الگوریتمهای هشینگ
در مرکز هشینگ، تابع ریاضیاتی وجود دارد که بر روی دو بلاک داده با اندازه ثابت اعمال میشود تا یک کد هش شده را ایجاد کند. این تابع هش، بخشی از الگوریتم هشینگ را تشکیل میدهد.
اندازه و حجم هر بلاک داده بر اساس الگوریتم، متغیر است. معمولا اندازه هر بلاک از ۱۲۸ الی ۵۱۲ بیت است. شکل زیر تابع هش را نشان میدهد.

الگوریتم هشینگ شامل چندین مرحله است که از توابع هش در آن استفاده میشود. در هر مرحله، ورودی با اندازه ثابت میگیرد و آن را با Message Block و خروجی مرحله قبل ترکیب میکند.
این فرآیند تا جایی که نیاز باشد، تکرار میشود تا کل پیام را هش کند. نمای کلی الگوریتم هشینگ در شکل زیر نشان داده شده است.

در واقع مقدار هش اولین Message Block تبدیل به ورودی دومین عملیات هش میشود، خروجی به دست آمده نیز برای سومین عملیات مورد استفاده قرار میگیرد و این روند ادامه پیدا می کند. به این فرآیند، اثر avalanche هشینگ میگویند.
نتیجه اثر avalanche، مقادیر هش کاملا متفاوت برای دو پیام است؛ حتی اگر فقط در یک بیت پیامها تفاوت داشته باشند.
الگوریتم و تابع هش با هم تفاوت دارند. تابع هش با اجرا بر روی دو بلاک داده باینری که طول ثابت دارند، یک کد هش تولید میکند.
الگوریتم هشینگ فرآیندی برای استفاده از تابع هش است. به طور مشخص چگونگی تجزیه پیام و نحوه ترکیب شدن با نتایج Message Blockهای قبلی را الگوریتم هشینگ میگویند.
توابع هش پرکاربرد
در ادامه به چند تابع هش پرکاربرد میپردازیم.
خلاصه پیام (Message Digest)
الگوریتم MD۵ تا چندین سال محبوبترین و پر استفادهترین تابع هش بود.
خانواده MD شامل توابع هش MD۲، MD۴ ، MD۵ و MD۶ است که به تصویب استاندارد اینترنت RFC ۱۳۲۱ رسیدند. این توابع هش از سری توابع با طول ۱۲۸ بیت هستند.
تابع MD۵ به طور گسترده در نرم افزارها استفاده میشد تا یکپارچگی فایل منتقل شده را تضمین کند. برای مثال، سرورها معمولا یک عدد با نام checksum قبل از ارسال فایل محاسبه میکنند. کاربر فایل را از سرور دریافت کرده و checksumها را مقایسه میکند؛ اگر مطابقت داشتند، صحت فایل تضمین شده است.
در سال ۲۰۰۴، در MD۵ نواقصی پیدا شد. این گزارش در مورد آنالیز یک حمله بود که توانست در مدت زمان یک ساعت از این نواقص استفاده کند. همین امر باعث شد که استفاده از این تابع هش توصیه نشود.
تابع هش ایمن (SHA)
خانواده SHA شامل چهار الگوریتم است که عبارتند از : SHA-۰, SHA-۱, SHA-۲, SHA-۳. اگرچه این چهار الگوریتم از یک خانواده هستند، اما از نظر ساختاری متفاوتاند.
نسخه اصلی، SHA-۰ است که یک تابع هش ۱۶۰ بیتی است و توسط موسسه ملی استانداردها و تکنولوژی (NIST) در سال ۱۹۹۳ منتشر شد. این الگوریتم ضعفهایی داشت و نتوانست محبوبیت زیادی کسب کند. در سال ۱۹۹۵، SHA-۱ برای اصلاح ضعفهای SHA-۰ طراحی شد.
الگوریتم SHA-۱ پرکاربردترین تابع هش SHA است. از این الگوریتم در برنامهها و پروتکل های بسیار زیادی نظیر SSL مورد استفاده قرار گرفت.
در سال ۲۰۰۵، روشی برای نشان دادن نواقص SHA-۱ در دورههای زمان یافت شد و باعث شد استفاده بلندمدت از SHA-۱ با شک و ابهام رو به رو شود.
خانواده SHA-۲ بر اساس تعداد بیت در مقدار هش آنها به چهار عضو تقسیم میشود که عبارتند از: SHA-۲۲۴, SHA- ۲۵۶, SHA- ۳۸۴, SHA-۵۱۲. تاکنون حمله موفقیت آمیزی به تابع هش SHA-۲ گزارش نشده است.
اگرچه SHA-۲ یک تابع هش قوی است و تفاوت چشمگیری با SHA-۱ دارد، با این حال طرح اصلی آن همچنان مشابه SHA-۱ است. بنابراین NIST در صدد طراحی تابع هش رقابتی جدیدی برآمد.
در اکتبر ۲۰۱۲، NIST الگوریتم Keccak را به عنوان استاندارد SHA-۳ انتخاب کرد. Keccak دارای مزایای بسیاری نظیر عملکرد موثر و مقاوم خوب در برابر حمله هاست.
ریپمد (RIPEMD)
ریپمد مخفف RACE Integrity Primitives Evaluation Message Digest است. این مجموعه توابع هش توسط جامعه تحقیقاتی آزاد طراحی شده است و عموما به اسم خانواده توابع هش اروپایی شناخته میشود.
این مجموعه شامل RIPEMD، RIPMED-۱۲۸ و RIPMED-۱۶۰ است. همچنین نسخههای ۲۵۶ و ۳۲۰ بیت این الگوریتم نیز موجود است.
ریپمد اصلی که ۱۲۸ بیت است، بر اساس اصول MD۴ عمل میکند و برای ارائه امنیت موارد مشکوک ایجاد شده است. ریپمد ۱۲۸ بیت به عنوان یک جایگزین برای از بین بردن آسیب پذیریهای ریپمد اصلی منتشر شده است.
ریپمد-۱۶۰ نسخه بهبود یافته و پر استفاده این خانواده است. در نسخههای ۲۵۶ و ۳۲۰ بیتی، احتمال وجود اختلال کاهش یافته، اما در مقایسه با ریپمد- ۱۶۰ و ۱۲۸ بیت از سطح امنیت بالاتری برخوردار نیست.
ویرلپول (Whirlpool)
ویرلپول یه تابع هش ۵۱۲ بیتی است.
این تابع از تغییر در نسخه استاندارد رمزنگاری پیشرفته (AES) ایجاد شده است. یکی از طراحان این تابع وینسنت ریمن است که از موسسان AES است.
سه نسخه از ویرلپول منتشر شده است که عبارتند از: WHIRLPOOL-۰, WHIRLPOOL-T, WHIRLPOOL
آخرین به روز رسانی: ۱۳۹۹/۴/۸