منابع مطالعه بیشتر در مورد مقدمات بلاکچین
تابع هش یکی از ارکان اصلی اینترنت امن است. این توابع یکی از مهمترین و کاربردیترین علوم رایانهای هستند که علاوهبر کاربردشان در افزایش امنیت استفاده از دنیای وب، از طریق الگوریتم رمزنگاری در دنیای کریپتوکارنسی نیز بسیار پرکاربرد هستند. در این مقاله قصد داریم مفهوم تابع هش را به زبانی ساده بازگو کنیم.
هشینگ یا هش کردن یعنی چه؟
در فرایند هشینگ از طریق یک فرمول ریاضی ورودیها با مقادیر مختلف تبدیل به یک خروجی با مقدار ثابت میشوند.
بهعبارتی دیگر، با هش کردن مقداری را که میتواند تصویر، حروف یا اعداد باشد با طول نامعلوم، به یک خروجی با طول مشخص و قطعی تبدیل میکنیم. به این فرایند، “تابع درهم ساز” نیز میگویند.
فرایند هشینگ در مبانی امنیت اطلاعات بسیار کاربردی است و مهمترین کاربرد آن زمانی است که شخصی قصد دارد یک پیام را به صورت کاملاً اختصاصی از طریق ایجاد یک فرمول، فقط برای یک گیرنده ارسال کند.
خروجی هشینگ را “هش” یا “مقدار هش” میگویند و تابع ریاضی آن به “تابع هش” معروف است.
تابع هش (Hash Function) چیست؟
تابع هش یا توابع هش الگوریتمهای ریاضی هستند که دادهها را با اندازه و طول متغیر دریافت میکنند و به خروجی یکسان و قطعی تبدیلشان میکنند. توابع هش رکن اصلی فرایند هشینگ هستند.
به عبارتی دیگر، میتوان گفت تابع هش یک رشته کد با طول متناوب را دریافت و تبدیل به یک خروجی با طول ثابت میکند.
ویژگیهای اصلی تابع هش
- طول خروجی تابع هش یا مقدار هش، همیشه ثابت است.
- تا زمانی که ورودی تغییر نکند، مقداری خروجی تابع هش قطعی و ثابت است.
- مقدار هش معمولاً بسیار کوچکتر از ورودی است. بههمین خاطر به تابع هش، فشرده ساز نیز میگویند.
- عملکرد تابع هش با رمزنگاری متفاوت است.
- توابع هش بهصورت یکطرفه طراحی شدهاند. بهعبارتی دیگر، در هشینگ بهدست آوردن خروجی از ورودی امکانپذیر است و عملیات عکس آن یعنی بهدست آوردن ورودی از خروجی تقریباً غیرممکن است.
کاربردهای تابع هش
-
ذخیره کلمه عبور: یکی از کاربردهای اصلی این الگوریتمها، ذخیرهی رمزهای عبور در بستر وب است. تابع هش پسوردها را بهطور شفاف ذخیره نمیکند و آنها را بهصورت یک فرمول هش ذخیره و ثبت میکند. هکرها هنگام حمله به سیستم فقط میتوانند خروجی هش را بهدست آورند که با توجه به توضیحی که کمی قبلتر در رابطه با یک طرفه بودن عملیات هشینگ دادیم؛ بهدست آوردن ورودی از طریق مقدار هش غیرممکن است. در نتیجه ذخیره پسورد از این روش امنیت بالایی دارد.
-
امنیت بلاکچین: توابع هش در حفظ امنیت شبکههای بلاکچین و فضای کریپتوکارنسیها جایگاه مهم و اساسی دارند. فرایند رمزنگاری در بلاکچینها از طریق این الگوریتمها انجام میشود. دادههای موجود روی هر بلاک از طریق فرایند هشینگ به به یک رشته کد تبدیل میشوند و به زنجیرهی اصلی میپیوندند.
-
بررسی صحت داده: یکی دیگر از کاربردهای الگوریتمهای هش، تولید چک سام (CheckSum) بر روی فایلهاست. چک سام، به کاربران تضمین صحت داده میدهد و به آنها کمک میکند تا هر تغییری را بر روی فایلها سریعاً متوجه شوند. اما این سیستم در مورد اصالت فایل تضمینی نمیدهد و هکرها میتوانند با تغییر کلی فایل، هش جدید تولید و از این طریق به دادههای فایل دسترسی پیدا کنند. استفاده از چک سام زمانی کاربرد دارد که کاربر در رابطه با اصالت فایل اطمینان داشته باشد.
تابع هش چگونه کار میکند؟
همانطور که گفتیم؛ توابع هش با توجه به سبک ساز و کارشان خروجیهایی با اندازههای متفاوت تولید میکنند؛ اما اندازهی خروجی یک نوع خاص از تابع هش همیشه یکسان است. برای مثال الگوریتم SHA-256 که تابع هش بیت کوین و پرکاربردترین هش جهان است؛ فقط قادر به تولید خروجی 256 بیتی است. طول و مقدار ورودی هر میزان که باشد، مقدار هش 256 بیت خواهد بود.
در مثال زیر، کلمه Ircc را با 2 حالت حرف اول بزرگ و حرف اول کوچک در تابع هش بیت کوین همان SHA-256 جای دادهایم:
Ircc: 65592d00da56347062e6dc84e8ff978ba021267b288bbe3c7f2cb5c04d797bd4
ircc: 478734e921cc9b571d7ab5fc226dcb2ce59fcab83fb73258ab8082382d86c6ee
همانطور که مشاهده میکنید، با کوچک و بزرگ شدن فقط یک حرف، کد هش خروجی تغییر میکند؛ اما هر دو شکل همان مقدار خروجی 256 بیتی را بهوجود میآورند. تا به اینجا بارها اشاره کردیم که مقدار ورودی هرچه قدر هم که باشد، یک تابع هش مقدار ثابتی خروجی دارد.
نکته: خروجی با طول ثابت سبب افزایش امنیت میشود؛ زیرا اگر کسی سعی در رمزگشایی و حمله به شبکه داشته باشد، با این شیوه قادر به تشخیص ورودی نخواهد بود.
تابع مطرح دیگری که وجود دارد، SHA-1 که مخفف عبارت الگوریتم هش ایمن (Secure Hash Algorithms) است. این عبارت شامل مجموعهای از توابع هش رمزنگاری شده است که عبارتند از: SHA-0 ،SHA-1 ،SHA-2 و SHA-3.
تابع SHA-256 به همراه SHA-512 و انواع دیگر، بخشی از گروه SHA-2 هستند. در حال حاضر، فقط گروههای SHA-2 و SHA-3 ایمن در نظر گرفته میشوند.
حال اگر مثال بالا را در تابع SHA-1 قرار دهیم؛ مقادیر تابع زیر بهدست خواهد آمد:
Ircc: a6f9af856be33de008c9f5ffb942e2c4e2d64
ircc: 3ec8e2b221402e786dfa6f0884a0e7f7be11c
این تابع هم مانند همهی توابع از ورودیهایی با طول متناوب، مقادیر ثابت تولید میکند و در صورت تغییر کد ورودی مقدار هش آن تغییر میکند.
تابع هش رمزنگاری چیست؟
تابع هش رمزنگاری همان تابع هش است که تا اینجا ویژگیهای آنرا بازگو کردیم. با این تفاوت که این الگوریتم از فرایند رمزنگاری برای افزایش دو چندان امنیت استفاده میکند.
قبلتر گفتیم که بهدست آوردن ورودی از مقدار هش کار بسیار دشواری است و تقریباً محال است. این امر سبب شده فرایند هشینگ امن و قابل اطمینان باشد. با این حال، توسعهدهندگان سعی کردهاند از طریق رمزنگاری این امنیت را در تابع هش رمزنگاری شده چند برابر کنند.
این توابع نوع خاصی از الگوریتمهای هش هستند که ویژگیهای مخصوص به خود را دارند؛ این ویژگیها سبب شده برای تشخیص هویت، حفظ امنیت بیشتر، ساخت امضای دیجیتال و تایید صحت دادهها در سیستمهای دیجیتالی مختلف مورد استفاده قرار بگیرند.
ویژگیهای تابع هش رمزنگاری
1. قطعی بودن
تابع هش در ازای یک ورودی مشخص، مقدار هش ثابت ارائه میدهد. فرقی نمیکند این ورودی چند بار در تابع قرار بگیرد؛ میزان خروجی همیشه ثابت خواهد بود.
این ویژگی سبب شده پیگیری دادهها آسانتر باشد. اگر هربار بهازای یک ورودی ثابت، مقدار هش متفاوت ارائه شود؛ کاربران با انبوهی از کدهای هش مواجه خواهند بود که جمعآوری و پیگیری آنها دشوار و زمانبر است.
2. سرعت بالا در محاسبه
تابع هش باید ورودی را به سرعت تبدیل به مقدار هش کند. اگر این محاسبه به میزان کافی سریع نباشد، سیستم نا کارآمد است.
3. یکطرفه بودن
تابع هش رمزنگاری، تابع یکطرفه است. یعنی در مقابل مقدار ورودی، خروجی به آسانی بهدست میآید؛ اما عملیات برعکس این روند نمیتوان گفت کاملاً غیر ممکن اما سخت و غیر عملی است.
تصور کنید اعداد بین 5 تا 10 را در این تابع قرار دادهایم و خروجیهای ثابت آنها را بهدست آوردهایم. در این لیست کوتاه و با توجه به قطعیت مقدار هش، میتوان با جایگزینی مجدد ورودیها در تابع، مقدار ورودی هر خروجی را کشف کرد.
اما این عملیات زمانی که با لیست بلند بالایی از مقادیر ورودی مواجه هستیم، فرایندی بسیار سخت و زمانبر و میتوان گفت غیر ممکن است. در این شرایط میتوان از جستجوی جامع که به آن جستجوی بیخردانه یا خام نیز گفته میشود؛ استفاده کرد.
بهاین ترتیب که تمام خروجیها را یک به یک و بهصورت تصادفی با دادههای ورودی امتحان کنید تا به نتیجهی نهایی و درست دست پیدا کنید. در این جستجو شانس یافتن پاسخ درست بسیار پایین است و همانطور که گفتیم، روشی دور از خرد است.
4. تغییر خروجی با تغییرات ورودی
کوچکترین تغییر در مقدار ورودی تابع هش رمزنگاری، مقدار خروجی هش را بهطور کامل تغییر خواهد داد.
برای مثال، هنگامی که پسورد اینستاگرام خود را وارد میکنید، سیستم با توجه به مقدار هش قبلی که برای این ورودی ذخیره کرده است، اجازهی ورود به حساب کاربری را برای شما صادر میکند. اگر کوچکترین تغییری در پسوردی که وارد میکنید ایجاد شود، دیگر خروجی هش قبلی کار نمیکند و سیستم اجازهی دسترسی به پروفایلتان را نخواهد داد و به شما هشدار اشتباه بودن رمز ورود میدهد.
5. متفاوت بودن مقادیر هش برای هر ورودی
هر ورودی در فرایند هشینگ دارای یک مقدار هش مخصوص به خود خواهد بود و ممکن نیست که هش دو مقدار متفاوت ورودی با هم مشابه یا برابر باشند.
میتوان گفت هیچگاه دو مقدار متفاوت ورودی تحت هیچ شرایطی هش خروجی شبیه بههم نخواهند داشت. اگر ورودی A دارای مقدار هش H3 باشد، امکان ندارد که ورودی B نیز همین خروجی را بدهد.
6. ثابت بودن میزان خروجی
ظی فرایند هشینگ بهازای هر مقدار ورودی حتی با اندازههای بسیار بزرگ، طول مقدار هش همیشه ثابت و به یک اندازه خواهد بود. اگر عبارات «سلام روز گرم تابستانی شما بخیر» و «سلام» را در یک تابع هش 256 بیتی قرار دهیم، میزان هش خروجی هر دو به یک اندازه خواهد بود و عبارت بلندتر هش طولانیتری نخواهد داشت.
این روش سبب شده زمان محاسبات کوتاهتر شود و همچنین جمعآوری پیگیری دادههای خروجی برای کاربران آسانتر باشد.
استفاده از تابع هش در ماینینگ ارزهای دیجیتال
در فرایند ماینینگ ارزهای دیجیتال برای مثال بیت کوین، یکی از مراحلی که ماینرها باید طی کنند، استفاده از تابع هش است. استفادهی بسیار ماینرها از هشینگ در طی فرایند استخراج بلاکهای جدید، از اصلیترین دلایل امنیت شبکه بلاکچین است.
یک ماینر برای ایجاد هش بلاکی که در حال ماین کردن آن است، باید ورودیهای متعددی را بررسی کند. آنها فقط زمانی میتوانند اعتبارسنجی بلاک جدید خود را نهایی کنند که یک مقدار هش با تعداد صفرهای اولیه مشخص پیدا کنند. مقدار این صفرها سختی فرایند استخراج را مشخص میکنند و تعداد آنها بستگی به مقدار هش دارد و توسط شبکه بلاکچین مشخص میشود.
نرخ هش ریت
اگر در رابطه با کاربرد توابع هش در فرایند ماینینگ ارزهای دیجیتال مطالعه کرده باشید؛ بیشک با عبارت هش ریت (Hash Rate) مواجه شدهاید. “هش ریت” یا “نرخ هش” نشان دهندهی میزان قدرت پردازش شبکه در استخراج بیت کوین است و معیاری برای اندازهگیری عملکرد یک دستگاه ماینر است. میتوان گفت هش ریت، تعداد عملیاتهای هشینگ که در بستر فرایندهای استخراج شبکه در حال اجرا هستند را نمایش میدهد.
اگر میزان هش ریت شبکه بهخاطر افزایش عملیات ماینینگ بالا برود؛ سیستم بهطور خودکار سختی استخراج را طوری تنظیم میکند که میانگین لازم برای استخراج هر بلاک در شبکه بیت کوین همان 10 دقیقه باقی بماند.
در حالتی دیگر، اگر به خاطر توقف ماینینگ چندین ماینر بهصورت همزمان، نرخ هش کاهش پیدا کند؛ باز هم شبکه سختی استخراج را بهگونهای تنظیم میکند که میانگین زمان ماین کردن تغییری نداشته باشد.
محاسبه نرخ هش
«هش بر ثانیه» رایجترین مقیاس برای اندازهگیری نرخ هش است که نشان میدهد در هر ثانیه چند هش انجام میگیرد.
تعدادی دیگر از مقیاسهای اندازهگیری هش ریت که در واقع تنها عمل تبدیل واحد بر روی آنها صورت گرفته است، عبارتند از:
- 1 KH/s یا هزار هش بر ثانیه
- 1 MH/s یا یک میلیون هش بر ثانیه
- 1 GH/s یا یک میلیارد هش بر ثانیه
- 1 TH/s یا یک تریلیون هش بر ثانیه
- 1 PH/s یا یک کوادریلیون هش بر ثانیه
- 1 EH/s یا یک کوینتیلیون هش بر ثانیه
ارقام بالا به ترتیب کیلوهش، مگاهش، گیگاهش، تراهش، پتاهش و اگزا هش نامگذاری میشوند.
توابع هش پر کاربرد
1. MD5
تابع هش MD که کوتاه شدهی عبارت Message Digest و به معنای خلاصه پیام است؛ شامل توابع هش MD2 ،MD4 ،MD5 و MD6 است. رونالد ریوست در سال 1991 میلادی تابع MD5 را جایگزینی برای نسخهی پیشین آن یعنی MD4 طراحی کرد. MD5 هش 128 بیتی تولید میکند و به عنوان هش رمزنگاری طراحی شده است که در دورهای بسیار از آن استفاده میشد، اما بهدلیل ایرادهای متعددی که داشت، بهتدریج از فرایندهای رمزنگاری کنار گذاشته شد. امروزه از تابع هش MD5 برای چک سام استفاده میشود.
2. SHA
کمی قبلتر اشاره کردیم که SHA الگوریتم هش ایمن است. این تابع هش توسط موسسه ملی استاندارد و فناوری (NIST) آمریکا و سایر سازمانهای امنیتی طراحی شده است. SHA-0 نخستین عضو خانواده SHA در سال 1993 معرفی شد که کمی بعد بهدلیل مشکلات قابل توجهی که داشت، نسخهی جدیدتری از آن ارائه شد تا نقایص نسخهی پیشین را رفع کند. نام تابع جدید SHA-1 بود.
SHA-1 یک تابع هش 160 بیتی مشابه تابع MD5 بود و با هدف اینکه بخشی از الگوریتم امضای دیجیتال باشد، طراحی شد. سال 2005 در این تابع هش نیز مشکلات امنیتی کشف شد که احتمال داشت هکرها به آن نفوذ پیدا کنند.
پس توسعه دهندگان الگوریتم جدید و ایمن SHA-2 که متشکل از ۶ تابع هش با مقادیر هش متفاوت 224، 256، 384 و 512 بیتی بود را معرفی کردند. نام این توابع نیز با توجه به مقدار هش تولید شده توسط آنها انتخاب شده است؛ SHA-224 ،SHA-256 SHA-384 ،SHA-512 ،SHA-512/224 و SHA-512/256. تفاوت اصلی این الگوریتمها در طول مقدار هش آنهاست.
بالاتر اشاره کردیم که الگوریتم SHA-256 در بلاکچینِ بیت کوین استفاده میشود و پرکاربردترین تابع هش جهان است. همچنین از این الگوریتم در TLS ،SSL ،PGP ،SSH، توسعه چند منظوره پست الکترونیک، اینترنت/امن و IPsec یا همان ایمنسازی پروتکل اینترنت استفاده میشود.
SHA-3 آخرین عضو از خانواده الگوریتم هش ایمن، در سال 2015 توسط NIST منتشر شد. در سال 2012 در جریان یک مسابقه در رابطه با طراحی الگوریتمی جدید، این تابع به عنوان برترین تابع هش برگزیده شد. SHA-3 در واقع زیرمجموعهای از خانواده گستردهتری به نام Keccak است.
3. RIPEMD
RIPEMD کوتاه شدهی عبارت «RACE Integrity Primitives Evaluation Message Digest» است. این تابع نیز مانند الگوریتم SHA، مجموعهای از توابع هش است که یک گروه تحقیقاتی بلژیکی به نام COSIC در سال ۱۹۹۶ میلادی آنرا معرفی کردند. در طراحی این تابع از اصول بهکار رفته در طراحی تابع MD4 و سیستم عملکردی SHA-1 استفاده شده است. توابع این مجموعه دارای مقادیر متفاوت 128، 160، 256 و 320 بیتی هستند و امنیت بالایی دارند.
4. Whirlpool
این الگوریتم یکی دیگر از توابع هش رمزنگاری است که در سال 200 توسط وینسنت ریمن و پائولو بارتو طراحی شد. Whirlpool بر اساس نسخه اصلاح شدهی استاندارد رمزنگاری پیشرفته (AES) ساخته شده است. این تابع هر پیامی با طول کمتر از 2256 بایت را دریافت و به مقدار هش 64 بایتی تبدیل میکند.
تابع هش ویرپول از سال 2000 تاکنون، 2 بار بازبینی شده است. در بازبینی نخست در سال 2001، S-box را تغییر دادند تا پیادهسازی این الگوریتم بر روی سختافزار آسانتر شود. در سال 2003 و بازبینی دوم یک مشکل امنیتی در آن کشف شد و سریعاً توسط توسعه دهندگان تابع برطرف شد. الگوریتم اولیه و اصلی را Whirlpool-0، بازبینی اول Whirlpool-T و نسخه نهایی را Whirlpool نام دارند.
5. Blake
تابع هش Blake جزو 5 الگوریتم برتر به انتخاب موسسه ملی استاندارد و فناوری ایالات متحده (NIST) است. این الگوریتم همانند SHA-2، از 2 تابع مختلف تشکیل شده است. یکی از کلمات 32 بیتی استفاده میکند و طول هش محاسبهشدهی آن حداکثر 256 بیت است؛ دیگری از کلمات 64 بیتی استفاده میکند با طول هش 512 بیت.
Blake2 در سال 2012 منتشر شد. هدف از طراحی این الگوریتم، معرفی جایگزینی برای الگوریتمهای پرکاربرد اما آسیبپذیر MD5 و SHA-1 در برنامههایی که نیازمند کارایی بالایی بودند، بود. این تابع نیز خود به دو زیرگروه Blake2b و Blake2s تقسیم میشود. گفته میشود Blake2 از MD5، SHA-1، SHA-2 و SHA-3 سریعتر است و از لحاظ امنیت نیز با SHA-3، یعنی آخرین نسخه الگوریتم هش ایمن برابری میکند.
صحبت پایانی
توابع هش عادی در فرایندهایی مانند جستجو در پایگاههای داده، تجزیه و تحلیل پروندهها و دادههای سنگین و حجیم، مدیریت دادهها و اطلاعات و زمینههای متعدد دیگر کاربرد دارند. توابع هش رمزنگاری شده هم بهطور گسترده در زمینهی امنیت اطلاعات از جمله تایید اعتبار پیام، اثر انگشت دیجیتال، تایید پرداخت و دیگر موارد امنیتی اطلاعاتی استفاده میشود.
در سیستم بیت کوین توابع هش رمزنگاری در زیرساخت، فرایند استخراج و ایجاد آدرسها، کلیدهای عمومی و خصوصی نقش دارند.
همچنین این توابع در زمانی که با حجم زیادی از اطلاعات مواجه هستیم، به کمکمان میآیند. در این حالت، میتوان یک فایل بزرگ و دارای حجم بالای اطلاعات را به عنوان ورودی به یک تابع هش داد و سپس از خروجی آن که حجم بسیار کمتری دارد، بهراحتی استفاده کرد.
بهطور کلی، میتوان گفت اگر توابع هش نبودند، امروزه خبری از امنیت در بستر وب و یا دنیای ارزهای دیجیتال نبود. آرامش خاطری که هنگام استفاده از اینترنت و دنیای ارزهای دیجیتال داریم، بهخاطر حضور این توابع کاربردی و حیاتی هستند که امنیت دادهها و پیامها را در این پلتفرمها حفظ میکنند.
منبع
https://wallex.ir/blog/تابع-هش-به-زبان-ساده/
منابع بیشتر: