برنامه نویسی

طراحی سایت

مشاوره و آموزش

آشنایی با تابع هش به زبان ساده

مهدی عابدپور

مهدی عابدپور

آخرین اخبار

تا اینجا متوجه شدیم کریپتوکارنسی چیست؟ حالا به سراغ یکی دیگر از مفاهیم این حوزه به نام هش می‌رویم. تابع هش یکی از ارکان اصلی اینترنت امن است. این توابع یکی از مهم‌ترین و کاربردی‌ترین علوم رایانه‌ای هستند که علاوه بر کاربردشان در افزایش امنیت استفاده از دنیای وب خصوصاً تکنولوژی WEB3، از طریق الگوریتم رمزنگاری در دنیای کریپتوکارنسی نیز بسیار پر‌کاربرد هستند. در این مقاله قصد داریم مفهوم تابع Hash را به زبانی ساده بازگو کنیم.

مفهوم هشینگ یا هش کردن

در فرایند هشینگ از طریق یک فرمول ریاضی ورودی‌ها با مقادیر مختلف تبدیل به یک خروجی با مقدار ثابت می‌شوند. به عبارتی دیگر، با Hash کردن مقداری را که می‌تواند تصویر، حروف یا اعداد باشد با طول نا‌معلوم، به یک خروجی با طول مشخص و قطعی تبدیل می‌کنیم. به این فرایند، تابع درهم ساز نیز می‌گویند.

فرایند هشینگ در مبانی امنیت اطلاعات بسیار کاربردی است و مهم‌ترین کاربرد آن زمانی است که شخصی قصد دارد یک پیام را به صورت کاملاً اختصاصی از طریق ایجاد یک فرمول، فقط برای یک گیرنده ارسال کند. خروجی هشینگ را Hash یا مقدار هش می‌گویند و تابع ریاضی آن‌ به تابع Hash معروف است.

تابع هش (Hash Function) چیست؟

تابع Hash یا توابع هش الگوریتم‌های ریاضی هستند که داده‌ها را با اندازه و طول متغیر دریافت می‌کنند و به خروجی یکسان و قطعی تبدیلشان می‌کنند. توابع Hash رکن اصلی فرایند هشینگ هستند.

به عبارتی دیگر، می‌توان گفت تابع Hash یک رشته کد با طول متناوب را دریافت و تبدیل به یک خروجی با طول ثابت می‌کند.

ویژگی‌های اصلی تابع هش

هر تابع هش باید شامل ویژگی‌هایی خاص باشد که در ادامه به معرفی آنها می پردازیم:

  • طول خروجی تابع هش یا مقدار هش، همیشه ثابت است.
  • تا زمانی که ورودی تغییر نکند، مقداری خروجی تابع Hash قطعی و ثابت است.
  • مقدار هش معمولاً بسیار کوچک‌تر از ورودی است. به همین خاطر به تابع هش، فشرده‌ساز نیز می‌گویند.
  • عملکرد تابع هش با رمزنگاری متفاوت است.
  • توابع Hash به‌صورت یک‌طرفه طراحی شده‌اند. به عبارتی دیگر، در هشینگ به دست آوردن خروجی از ورودی امکان‌پذیر است و عملیات عکس آن یعنی به دست آوردن ورودی از خروجی تقریباً غیر‌ممکن است.

کاربردهای تابع هش

تابع هش در بلاک چین ۳ کاربرد اصلی دارد:

ذخیره رمز عبور

یکی از کاربردهای اصلی این الگوریتم‌ها، ذخیره‌ی رمزهای عبور در بستر وب است. تابع Hash پسوردها را به طور شفاف ذخیره نمی‌کند و آن‌ها را به‌صورت یک فرمول هش ذخیره و ثبت می‌کند. هکرها هنگام حمله به سیستم فقط می‌توانند خروجی هش را به دست آورند که با توجه به توضیحی که کمی قبل‌تر در رابطه با یک طرفه بودن عملیات هشینگ دادیم؛ به دست آوردن ورودی از طریق مقدار Hash غیر‌ممکن است. در نتیجه ذخیره پسورد از این روش امنیت بالایی دارد.

حفظ امنیت

توابع هش در حفظ امنیت شبکه‌های بلاک چین و فضای کریپتوکارنسی جایگاه مهم و اساسی دارند. فرایند رمزنگاری در بلاک چین‌ها از طریق این الگوریتم‌ها انجام می‌شود. داده‌های موجود روی هر بلاک از طریق فرایند هشینگ به یک رشته کد تبدیل می‌شوند و به زنجیره‌ی اصلی می‌پیوندند.

بررسی صحت داده

یکی دیگر از کاربردهای الگوریتم‌‌های هش، تولید چک سام‌ (CheckSum) بر روی فایل‌هاست. چک سام، به کاربران تضمین صحت داده می‌دهد و به آن‌ها کمک می‌کند تا هر تغییری را بر روی فایل‌ها سریعاً متوجه شوند. اما این سیستم در مورد اصالت فایل تضمینی نمی‌دهد و هکرها می‌توانند با تغییر کلی فایل، Hash جدید تولید و از این طریق به داده‌‌های فایل دسترسی پیدا کنند. استفاده از چک سام زمانی کاربرد دارد که کاربر در رابطه با اصالت فایل اطمینان داشته باشد.

تابع هش چگونه کار می‌کند؟

همان‌طور که گفتیم؛ توابع هش با توجه به سبک ساز‌ و‌‌ کارشان خروجی‌هایی با اندازه‌های متفاوت تولید می‌کنند؛ اما اندازه‌ی خروجی یک نوع خاص از تابع Hash همیشه یکسان است. برای مثال الگوریتم SHA-256 که تابع هش بیت کوین و پرکاربردترین هش جهان است؛ فقط قادر به تولید خروجی ۲۵۶ بیتی است. طول و مقدار ورودی هر میزان که باشد، مقدار هش ۲۵۶ بیت خواهد بود.

در مثال زیر، کلمه‌ Ircc را با ۲ حالت حرف اول بزرگ و حرف اول کوچک در تابع Hash بیت کوین همان SHA-256 جای داده‌ایم:

Ircc: 65592d00da56347062e6dc84e8ff978ba021267b288bbe3c7f2cb5c04d797bd4
ircc: 478734e921cc9b571d7ab5fc226dcb2ce59fcab83fb73258ab8082382d86c6ee

همان‌طور که مشاهده می‌کنید، با کوچک و بزرگ شدن فقط یک حرف، کد هش خروجی تغییر می‌کند؛ اما هر دو شکل همان مقدار خروجی ۲۵۶ بیتی را به وجود می‌آورند. تا به اینجا بارها اشاره کردیم که مقدار ورودی هر‌چه قدر هم که باشد، یک تابع Hash مقدار ثابتی خروجی دارد.

نکته: خروجی با طول ثابت سبب افزایش امنیت می‌شود؛ زیرا اگر کسی سعی در رمزگشایی و حمله به شبکه داشته باشد، با این شیوه قادر به تشخیص ورودی نخواهد بود.

تابع مطرح دیگری که وجود دارد، 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

این تابع هم مانند همه‌ی توابع از ورودی‌هایی با طول متناوب، مقادیر ثابت تولید می‌کند و در صورت تغییر کد ورودی مقدار Hash آن تغییر می‌کند.

تابع هش رمزنگاری چیست؟

تابع هش در کریپتوکارنسی

تابع هش رمزنگاری همان تابع Hash است که تا اینجا ویژگی‌های آن را بازگو کردیم. با این تفاوت که این الگوریتم از فرایند رمزنگاری برای افزایش دوچندان امنیت استفاده می‌کند.

قبل‌تر گفتیم که به‌دست آوردن ورودی از مقدار هش کار بسیار دشواری است و تقریباً محال است. این امر سبب شده فرایند هشینگ امن و قابل اطمینان باشد. با این حال، توسعه‌دهندگان سعی کرده‌اند از طریق رمزنگاری این امنیت را در تابع Hash رمزنگاری شده چند برابر کنند.

این توابع نوع خاصی از الگوریتم‌‌های Hash هستند که ویژگی‌های مخصوص به خود را دارند؛ این ویژگی‌ها سبب شده برای تشخیص هویت، ‌ حفظ امنیت بیشتر، ‌ ساخت امضای دیجیتال و تأیید صحت داده‌ها در سیستم‌های دیجیتالی مختلف مورد استفاده قرار بگیرند.

ویژگی‌های تابع هش رمزنگاری

تابع هش رمزنگاری یکی از پایه‌های اصلی بلاک چین امن است. در زیر ویژگی‌های آن را بررسی می‌کنیم:

قطعی بودن

تابع هش در ازای یک ورودی مشخص، مقدار Hash ثابت ارائه می‌دهد. فرقی نمی‌کند این ورودی چند بار در تابع قرار بگیرد؛ میزان خروجی همیشه ثابت خواهد بود. این ویژگی سبب شده پیگیری داده‌‌ها آسان‌تر باشد. اگر هر بار به‌ازای یک ورودی ثابت، مقدار هش متفاوت ارائه شود؛ کاربران با انبوهی از کدهای Hash مواجه خواهند بود که جمع‌آوری و پیگیری آن‌‌ها دشوار و زمان‌بر است.

سرعت بالا در محاسبه

تابع هش باید ورودی را به سرعت تبدیل به مقدار هش کند. اگر این محاسبه به‌ میزان کافی سریع نباشد، سیستم نا کار‌آمد است.

یک‌طرفه بودن

تابع هش رمزنگاری، تابع یک‌طرفه است. یعنی در مقابل مقدار ورودی، خروجی به آسانی به دست می‌آید؛ اما عملیات برعکس این روند نمی‌توان گفت کاملاً غیر ممکن اما سخت و غیر عملی است.

تصور کنید اعداد بین ۵ تا ۱۰ را در این تابع قرار داده‌ایم و خروجی‌های ثابت آن‌ها را به دست آورده‌ایم. در این لیست کوتاه و با توجه به قطعیت مقدار Hash ، می‌توان با جایگزینی مجدد ورودی‌ها در تابع، مقدار ورودی هر خروجی را کشف کرد.

اما این عملیات زمانی که با لیست بلند بالایی از مقادیر ورودی مواجه هستیم، فرایندی بسیار سخت و زمان‌بر و می‌توان گفت غیر ممکن است. در این شرایط می‌توان از جستجوی جامع که به آن جستجوی بی‌خردانه یا خام نیز گفته می‌شود؛ استفاده کرد.

به این ترتیب که تمام خروجی‌ها را یک به یک و به‌صورت تصادفی با داده‌های ورودی امتحان کنید تا به نتیجه‌ی نهایی و درست دست پیدا کنید. در این جستجو شانس یافتن پاسخ درست بسیار پایین است و همان‌طور که گفتیم، روشی دور از خرد است.

تغییر خروجی با تغییرات ورودی

کوچک‌ترین تغییر در مقدار ورودی تابع هش رمزنگاری، مقدار خروجی Hash را به طور کامل تغییر خواهد داد. برای مثال، هنگامی که پسورد اینستاگرام خود را وارد می‌کنید، سیستم با توجه به مقدار هش قبلی که برای این ورودی ذخیره کرده است، اجازه‌ی ورود به حساب کاربری را برای شما صادر می‌کند. اگر کوچک‌ترین تغییری در پسوردی که وارد می‌کنید ایجاد شود، دیگر خروجی Hash قبلی کار نمی‌کند و سیستم اجازه‌ی دسترسی به پروفایلتان را نخواهد داد و به شما هشدار اشتباه بودن رمز ورود می‌دهد.

متفاوت بودن مقادیر هش برای هر ورودی

هر ورودی در فرایند هشینگ دارای یک مقدار Hash مخصوص به خود خواهد بود و ممکن نیست که هش دو مقدار متفاوت ورودی با‌ هم مشابه یا برابر باشند.

می‌توان گفت هیچ‌گاه دو مقدار متفاوت ورودی تحت هیچ شرایطی Hash خروجی شبیه به هم نخواهند داشت. اگر ورودی A دارای مقدار هش H3 باشد، امکان ندارد که ورودی B نیز همین خروجی را بدهد.

ثابت بودن میزان خروجی

طی فرایند هشینگ به‌ازای هر مقدار ورودی حتی با اندازه‌های بسیار بزرگ، طول مقدار هش همیشه ثابت و به یک اندازه خواهد بود. اگر عبارات «سلام روز گرم تابستانی شما به خیر» و «سلام» را در یک تابع هش ۲۵۶ بیتی قرار دهیم، میزان Hash خروجی هر دو به یک اندازه خواهد بود و عبارت بلندتر Hash طولانی‌تری نخواهد داشت. این روش سبب شده زمان محاسبات کوتاه‌تر شود و همچنین جمع‌آوری پیگیری داده‌های خروجی برای کاربران آسان‌تر باشد.

استفاده از تابع هش در ماینینگ ارزهای دیجیتال

در فرایند ماینینگ ارزهای دیجیتال برای مثال بیت کوین، یکی از مراحلی که ماینرها باید طی کنند، استفاده از تابع هش است. استفاده‌ی بسیار ماینرها از هشینگ در طی فرایند استخراج بلاک‌‌های جدید، از اصلی‌ترین دلایل امنیت بلاک چین است.

یک ماینر برای ایجاد هش بلاکی که در حال ماین کردن آن است، باید ورودی‌های متعددی را بررسی کند. آن‌ها فقط زمانی می‌توانند اعتبارسنجی بلاک جدید خود را نهایی کنند که یک مقدار Hash با تعداد صفرهای اولیه مشخص پیدا کنند. مقدار این صفر‌‌ها سختی فرایند استخراج را مشخص می‌کنند و تعداد آن‌ها بستگی به مقدار هش دارد و توسط شبکه های بلاک چین مشخص می‌شود.

نرخ هش ریت

اگر در رابطه با کاربرد توابع Hash در فرایند ماینینگ ارزهای دیجیتال مطالعه کرده باشید؛ بی‌شک با عبارت هش ریت‌ (Hash Rate) مواجه شده‌اید. هش ریت یا نرخ Hash نشان‌ دهنده‌ی میزان قدرت پردازش شبکه در استخراج بیت کوین است و معیاری برای اندازه‌گیری عملکرد یک دستگاه ماینر است. می‌توان گفت هش ریت، تعداد عملیات‌های هشینگ که در بستر فرایندهای استخراج شبکه در حال اجرا هستند را نمایش می‌دهد.

اگر میزان هش ریت شبکه به‌خاطر افزایش عملیات ماینینگ ارزهای دیجیتال بالا برود؛ سیستم به طور خودکار سختی استخراج را طوری تنظیم می‌کند که میانگین لازم برای استخراج هر بلاک در شبکه بیت کوین همان ۱۰ دقیقه باقی بماند. در حالتی دیگر، اگر به خاطر توقف ماینینگ چندین ماینر به‌صورت هم‌زمان، نرخ هش کاهش پیدا کند؛ باز هم شبکه سختی استخراج را به‌گونه‌ای تنظیم می‌‌کند که میانگین زمان ماین کردن تغییری نداشته باشد.

محاسبه نرخ هش

هش بر ثانیه رایج‌‌ترین مقیاس برای اندازه‌گیری نرخ Hash است که نشان می‌دهد در هر ثانیه چند Hash انجام می‌گیرد. تعدادی دیگر از مقیاس‌های اندازه‌گیری هش ریت که در واقع تنها عمل تبدیل واحد بر روی آن‌ها صورت گرفته است، عبارت‌اند از:

  • ۱ KH/s یا هزار Hash بر ثانیه
  • ۱ MH/s یا یک میلیون Hash بر ثانیه
  • ۱ GH/s یا یک میلیارد Hash بر ثانیه
  • ۱ TH/s یا یک تریلیون Hash بر ثانیه
  • ۱ PH/s یا یک کوادریلیون Hash بر ثانیه
  • ۱ EH/s یا یک کوینتیلیون Hash بر ثانیه

ارقام بالا به ترتیب کیلوهش، مگاهش، گیگاهش، تراهش، پتاهش و اگزا هش نام‌گذاری می‌شوند.

توابع هش پر کاربرد

انواع توابع هش

در این بخش با پرکاربردترین توابع Hash آشنا می‌شویم.

MD5

تابع هش MD که کوتاه شده‌ی عبارت Message Digest و به معنای خلاصه پیام است؛ شامل توابع هش MD2،MD4،MD5 و MD6 است. رونالد ریوست در سال ۱۹۹۱ میلادی تابع MD5 را جایگزینی برای نسخه‌ی پیشین آن یعنی MD4 طراحی کرد. MD5 هش ۱۲۸ بیتی تولید می‌کند و به عنوان هش رمز‌نگاری طراحی شده است که در دوره‌ای بسیار از آن استفاده می‌شد، اما به دلیل ایرادهای متعددی که داشت، به‌تدریج از فرایندهای رمزنگاری کنار گذاشته شد. امروزه از تابع هش MD5 برای چک سام استفاده می‌شود.

SHA

کمی قبل‌تر اشاره کردیم که SHA الگوریتم هش ایمن است. این تابع Hash توسط مؤسسه ملی استاندارد و فناوری (NIST) آمریکا و سایر سازمان‌‌های امنیتی طراحی شده است. SHA-0 نخستین عضو خانواده SHA در سال ۱۹۹۳ معرفی شد که کمی بعد به دلیل مشکلات قابل توجهی که داشت، نسخه‌ی جدیدتری از آن ارائه شد تا نقایص نسخه‌ی پیشین را رفع کند. نام تابع جدید SHA-1 بود.

SHA-1 یک تابع هش ۱۶۰ بیتی مشابه تابع MD5 بود و با هدف این‌که بخشی از الگوریتم امضای دیجیتال باشد، طراحی شد. سال ۲۰۰۵ در این تابع هش نیز مشکلات امنیتی کشف شد که احتمال داشت هکرها به آن نفوذ پیدا کنند.

پس توسعه دهندگان الگوریتم جدید و ایمن SHA-2 که متشکل از ۶ تابع هش با مقادیر ه Hash ش متفاوت ۲۲۴، ۲۵۶، ۳۸۴ و ۵۱۲ بیتی بود را معرفی کردند. نام‌ این توابع نیز با توجه به مقدار هش تولید شده‌ توسط آن‌‌ها انتخاب شده است؛ SHA-224،SHA-256 SHA-384 ،SHA-512 ،SHA-512/224 و SHA-512/256. تفاوت اصلی این الگوریتم‌ها در طول مقدار هش ‌آن‌هاست.

بالاتر اشاره کردیم که الگوریتم SHA-256 در بلاک چینِ بیت کوین استفاده می‌شود و پرکاربرد‌ترین تابع Hash جهان است. همچنین از این الگوریتم در TLS ،SSL ،PGP ،SSH، توسعه چند منظوره پست الکترونیک، اینترنت/امن و IPsec یا همان ایمن‌سازی پروتکل اینترنت استفاده می‌شود.

SHA-3 آخرین عضو از خانواده الگوریتم هش ایمن، در سال ۲۰۱۵ توسط NIST منتشر شد. در سال ۲۰۱۲ در جریان یک مسابقه‌ در رابطه با طراحی الگوریتمی جدید، این تابع به عنوان برترین تابع Hash برگزیده شد. SHA-3 در واقع زیرمجموعه‌ای از خانواده گسترده‌تری به نام Keccak است.

RIPEMD

RIPEMD کوتاه شده‌ی عبارت “RACE Integrity Primitives Evaluation Message Digest” است. این تابع نیز مانند الگوریتم SHA، مجموعه‌‌ای از توابع Hash است که یک گروه تحقیقاتی بلژیکی به نام COSIC در سال ۱۹۹۶ میلادی آن‌را معرفی کردند. در طراحی این تابع از اصول به‌کار رفته در طراحی تابع MD4 و سیستم عملکردی SHA-1 استفاده شده است. توابع این مجموعه دارای مقادیر متفاوت ۱۲۸، ۱۶۰، ۲۵۶ و ۳۲۰ بیتی هستند و امنیت بالایی دارند.

Whirlpool

این الگوریتم یکی دیگر از توابع Hash رمزنگاری است که در سال ۲۰۰ توسط وینسنت ریمن (Vincent Rayman) و پائولو بارتو (Paoulo Bartou)طراحی شد. Whirlpool بر اساس نسخه اصلاح شده‌ی استاندارد رمزنگاری پیشرفته (AES) ساخته شده است. این تابع هر پیامی با طول کمتر از ۲۲۵۶ بایت را دریافت و به مقدار هش ۶۴ بایتی تبدیل می‌کند.

تابع هش ویرپول از سال ۲۰۰۰ تاکنون، ۲ بار بازبینی شده است. در بازبینی نخست در سال ۲۰۰۱، S-box را تغییر دادند تا پیاده‌سازی این الگوریتم بر روی سخت‌افزار آسان‌تر شود. در سال ۲۰۰۳ و بازبینی دوم یک مشکل امنیتی در آن کشف شد و سریعاً توسط توسعه دهندگان تابع بر‌طرف شد. الگوریتم اولیه و اصلی را Whirlpool-0، بازبینی اول Whirlpool-T و نسخه نهایی را Whirlpool نام دارند.

Blake

تابع هش Blake جزو ۵ الگوریتم برتر به انتخاب مؤسسه ملی استاندارد و فناوری ایالات متحده (NIST) است. این الگوریتم همانند SHA-2، از ۲ تابع مختلف تشکیل شده است. یکی از کلمات ۳۲ بیتی استفاده می‌کند و طول هش محاسبه‌شده‌ی آن حداکثر ۲۵۶ بیت است؛ دیگری از کلمات ۶۴ بیتی استفاده می‌کند با طول Hash ۵۱۲ بیت.

Blake2 در سال ۲۰۱۲ منتشر شد. هدف از طراحی این الگوریتم، معرفی جایگزینی برای الگوریتم‌های پرکاربرد اما آسیب‌پذیر MD5 و SHA-1 در برنامه‌هایی که نیازمند کارایی بالایی بودند، بود. این تابع نیز خود به دو زیرگروه Blake2b و Blake2s تقسیم می‌شود. گفته می‌شود Blake2 از MD5، SHA-1، SHA-2 و SHA-3 سریع‌تر است و از لحاظ امنیت نیز با SHA-3، یعنی آخرین نسخه الگوریتم هش ایمن برابری می‌کند.

تابع هش؛ عضوی از جهان بزرگ داده و رمزنگاری

توابع هش عادی در فرایند‌هایی مانند جستجو در پایگاه‌های داده، تجزیه و تحلیل پرونده‌ها و داده‌های سنگین و حجیم، مدیریت داده‌ها و اطلاعات و زمینه‌های متعدد دیگر کاربرد دارند. توابع Hash رمزنگاری شده هم به طور گسترده در زمینه‌ی امنیت اطلاعات از جمله تأیید اعتبار پیام، اثر انگشت دیجیتال، تأیید پرداخت و دیگر موارد امنیتی اطلاعاتی استفاده می‌شود.  در سیستم بیت کوین توابع هش رمزنگاری در زیرساخت، فرایند استخراج و ایجاد آدرس‌ها، کلید‌های عمومی و خصوصی نقش دارند.

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

به طور کلی، می‌توان گفت اگر توابع Hash نبودند، امروزه خبری از امنیت در بستر وب و یا دنیای ارزهای دیجیتال نبود. آرامش خاطری که هنگام استفاده از اینترنت و دنیای ارزهای دیجیتال داریم، به‌خاطر حضور این توابع کاربردی و حیاتی هستند که امنیت داده‌ها و پیام‌‌ها را در این پلتفرم‌ها حفظ می‌کنند.

تابع هش: Hash Function تابع ریاضی است که خروجی آن هش است.
هش: Hash رشته‌ای از کاراکترها با طول ثابت و جواب تابع هش است.
هشینگ: Hashing فرآیند تولید هش در تابع هش است.

از هشینگ برای اهداف مختلف استفاده می‌شود. برای مثال:

  • یکپارچگی داده (Data Integrity): از هش‌ها می‌توان برای اطمینان از اینکه داده‌ها دستکاری‌شده یا مخدوش نیستند، استفاده کرد. با هش کردن مجدد داده‌ها و مقایسه هش جدید با نسخه اصلی، امکان تشخیص هرگونه تغییر وجود دارد.
  • ذخیره‌سازی رمز عبور (Password storage): اغلب از هش‌ها برای ذخیره امن رمز عبور استفاده می‌شود. وقتی کاربر رمز عبور خود را وارد می‌کند، آن رمز طی فرآیند عبور تبدیل به هش می‌شود و آن با هش ذخیره‌شده مقایسه می‌شود. یک هکر تنها می‌تواند هش پسورد‌ها را ببیند. بنابراین نه می‌تواند توسط این هش‌ها وارد شود، نه از طریق آن‌ها کلمه‌های عبور را بدست آورد. دلیل آن یکطرفه بودن تابع هش است.
  • امضای دیجیتال (Digital signatures): از توابع هش برای تولید امضاهای دیجیتال استفاده می‌شود. کاربرد این پیام‌ها در تایید صحت پیام‌ها است.

هش به اطمینان از عدم دستکاری فایل‌ها کمک می‌کند. برای مثال اگر وب سایت ویکی لیکس، یک‌سری اسناد با هش MD5 را منتشر کند، هر کس که آن فایل‌ها را دانلود کند و هش آن را حساب کند، در صورت مغایرت هش حساب شده با هش منتشر شده توسط این سایت، متوجه خواهد شد که فایل دانلودشده به طریقی دچار دستکاری شده است. یکی از رایج‌ترین توابع هش، SHA-256 است که در بلاکچین بیت کوین به‌کار می‌رود.

ویژگی‌های تابع هش

ویژگی‌های معمول توابع هش عبارتند از:

  • طول ثابت خروجی (مقدار هش)
    • تابع هش، داده با طول متغیر را به طول ثابت تبدیل می‌کند.
    • معمولا اندازه هش بسیار کوچک‌تر از ورودی است؛ بنابراین توابع هش را گاهی با نام توابع فشرده‌ساز می‌شناسند.
    • تابع هش با خروجی 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 شود، باید دشوار باشد.
    • چون تابع هش یک تابع فشرده‌ساز با خروجی ثابت است، نداشتن تصادم برای آن غیرممکن است. این ویژگی تنها بیان می‌کند که پیدا کردن این تصادم‌ها باید بسیار سخت باشد.

نحوه محاسبه هش در بلاکچین

نحوه محاسبه هش در بلاکچین
منبع: jumpstartblockchain.com

هش‌ها در بلاک چین برای نشان دادن حالت فعلی کاربرد دارند؛ یعنی ورودی تابع، کل حالت فعلی بلاکچین است که شامل تمام تراکنش‌هایی که از ابتدا تاکنون صورت گرفته است. این تراکنش‌ها به عنوان ورودی هش می‌شوند (طی فرآیند Hashing) و خروجی حاصله (هش)، حالت فعلی بلاکچین را نشان خواهد داد. این هش برای توافق بین تمام بخش‌ها در دنیا بر سر اینکه حالت فعلی، تنها حالت فعلی و واقعی است بکار می‌رود. اما در حقیقت چگونه این هش‌ها محاسبه می‌شوند؟

  • هش اول برای بلاک اول یا بلاک ریشه‌ای محاسبه می‌شود که حاوی تراکنش‌های درون بلاک است.
  • دنباله‌ی تراکنش‌های اولیه برای محاسبه هشِ بلاکِ ریشه مورد استفاده قرار می‌گیرد.
  • برای هر بلاکی که بعد از آن تولید می‌شود، هشِ بلاک قبلی نیز مانند تراکنش‌های همان بلاک به‌عنوان ورودی مورد استفاده قرار می‌گیرد تا هش این بلاک مشخص شود.

هشِ هر بلاک جدید به هشِ بلاک قبل از آن اشاره می‌کند. این سیستم‌ از هش‌ها تضمین می‌کند که هیچ تراکنشی در گذشته قابل تغییر نباشد. چون اگر یک قسمت از تراکنش تغییر کند، هش همان بلاک نیز تغییر می‌کند و در نتیجه هش‌های بلاک‌های بعد از آن نیز تغییر خواهند کرد. در نهایت تشخیص تراکنش‌های دستکاری شده، بسیار ساده خواهد بود. زیرا برای این کار تنها نیاز دارید تا هش‌ها را با یکدیگر مقایسه کنید. نتیجه این کار بسیار جالب است. چرا که همه افراد روی زنجیره‌، تنها نیاز دارند تا روی ۲۵۶ بیت برای تایید حالت زنجیره بلاک توافق کنند. بلاک چین اتریوم در حال حاضر چند ده گیگابایت حجم دارد، اما در عین حال مقدار فعلی بلاکچین آن، یک هش شانزده دهی است که با ۲۵۶ بیت نشان داده می‌شود.

آشنایی با توابع هش پرکاربرد

با توجه به شناختی که از اهمیت هشینگ در بلاکچین به دست آوردیم، اکنون آشنایی با الگوریتم‌های هشینگ از اهمیت ویژه‌ای برخوردار است. الگوریتم هشینگ ایمن یا SHA رایج‌ترین تابع هش است که توسط موسسه ملی استانداردها و فناوری (NIST) پیشنهاد شده است. نسخه‌های بعدی SHA نظیر SHA-1 و SHA-2 و SHA-3 به دلیل قابلیت‌های خود بسیار شناخته شده‌اند. در ادامه به طور دقیق‌تر این الگوریتم‌ها را بررسی می‌کنیم.

الگوریتم SHA-1

الگوریتم SHA-1 می‌تواند از ورودی با طول‌های مختلف استفاده کند و سپس یک پیام ۱۶۰ بیتی تولید کرده و پیام‌ها را در بلاک‌هایی به اندازه ۵۱۲ بیت پردازش کند. اگر طول پیام ضریبی از ۵۱۲ بیت نباشد، الگوریتم SHA می‌تواند طول پیام را تغییر دهد تا به نزدیک‌ترین ضریب ۵۱۲ بیت برسد. الگوریتم SHA-۱ پرکاربردترین تابع هش SHA است. از این الگوریتم در برنامه‌ها و پروتکل های بسیار زیادی نظیر SSL مورد استفاده قرار گرفت. در سال ۲۰۰۵، روشی برای نشان دادن نواقص SHA-۱ در دوره‌های زمان یافت شد و باعث شد استفاده بلندمدت از SHA-۱ با شک و ابهام روبه‌رو شود.

الگوریتم SHA-2

الگوریتم SHA-2 در حال حاضر یکی از الگوریتم‌های محبوب در جامعه رمزنگاری است، هرچند همانند الگوریتم SHA-1 دارای نقاط ضعف خاصی است. الگوریتم SHA-2 پس از معرفی در سال ۲۰۰۱ دستخوش تغییراتی چشمگیر شده و ۴ نسخه مختلف از آن عرضه شده است. این ۴ نسخه عبارتند از SHA-256 و SHA-224 و SHA-512 و SHA-384. گفتنی است الگوریتم SHA-256 یکی از پذیرفته‌شده‌ترین الگوریتم‌های رمزنگاری است.

الگوریتم SHA-256

الگوریتم SHA-256 می‌تواند از طریق اندازه بلاک ۵۱۲ بیت، دایجست پیام ۲۵۶ بیت ایجاد کند، در حالی که الگوریتم SHA-224 از نسخه کوتاه‌تر SHA-256 بهره می‌برد و با استفاده از اندازه بلاک ۵۱۲ بیت می‌تواند دایجست پیام ۲۲۴ بیت تولید کند. الگوریتم SHA-512 می‌تواند با استفاده از اندازه بلاک ۱۰۲۴ بیت، دایجست پیام ۵۱۲ بیت تولید کند و الگوریتم SHA-384 از نسخه کوتاه‌تر SHA-512 بهره می‌برد و می‌تواند با استفاده از اندازه بلاک ۱۰۲۴ بیت، دایجست پیام ۳۸۴ بیت ایجاد کند.

الگوریتم SHA-3

الگوریتم‌های SHA-3 جدیدترین نسخه الگوریتم‌های هشینگ ایمن به شمار می‌آیند که اهمیت هشینگ در بلاکچین را نشان می‌دهند. SHA-3 درسال  ۲۰۱۵ عرضه شده و همانند استاندارد الگوریتم MD5 است. SHA-3 قابلیت این را دارد تا به عنوان جایگزینی برای SHA-2 عمل کند، در حالی که نسخه‌ها و طول هش آن مشابه با SHA-2 است. تنها تفاوت این دو الگوریتم این است که SHA-3 امنیت بهتری ارائه می‌دهد.

الگوریتم خلاصه پیام (Message Digest)

خانواده MD یا Message Digest شامل توابع هش MD2، MD4 ، MD5 و MD6 است که به تصویب استاندارد اینترنت RFC ۱۳۲۱ رسیدند. این توابع هش از سری توابع با طول ۱۲۸ بیت هستند. تابع MD5 به طور گسترده در نرم افزارها استفاده می‌شد تا یکپارچگی فایل منتقل شده را تضمین‌ کند. برای مثال، سرورها معمولا یک عدد با نام checksum قبل از ارسال فایل محاسبه می‌کنند. کاربر فایل را از سرور دریافت کرده و checksumها را مقایسه می‌کند؛ اگر مطابقت داشتند، صحت فایل تضمین شده است. در سال ۲۰۰۴، در MD5 نواقصی پیدا شد. این گزارش در مورد آنالیز یک حمله بود که توانست در مدت زمان یک ساعت از این نواقص استفاده کند. همین امر باعث شد که استفاده از این تابع هش توصیه نشود.

  • الگوریتم دایجست پیام MD2 در سال ۱۹۸۹ به عنوان جایگزینی برای توابع هش ایمن مختص پردازنده‌های ۸ بیتی عرضه شد. MD2 می‌تواند طول پیام را تغییر دهد تا ضریبی از ۱۶ بیت شود و چک‌سام ۱۶ بیتی ایجاد کند.
  • الگوریتم MD4 نسخه بهبودیافته MD2 است و می‌تواند طول پیام را تا حدی تغییر دهد که ۶۴ بیت کمتر از ضرایب ۵۱۲ بیت شود. در نتیجه، MD4 می‌تواند بلاک‌های ۵۱۲ بیتی را پردازش کرده و دایجست پیام ۱۲۸ بیت تولید کند.
  • الگوریتم MD5 آخرین نسخه الگوریتم دایجست پیام است و همانند MD4 می‌تواند طول پیام را تغییر دهد. به علاوه، MD5 ویژگی‌های امنیتی بیشتری ارائه می‌دهد که به کاهش سرعت تولید دایجست پیام منجر می‌شود.

ریپمد (RIPEMD)

ریپمد مخفف RACE Integrity Primitives Evaluation Message Digest است. این مجموعه توابع هش توسط جامعه تحقیقاتی آزاد طراحی شده است و عموما به اسم خانواده توابع هش اروپایی شناخته می‌شود. این مجموعه شامل RIPEMD، RIPMED-128 و RIPMED-160 است. همچنین نسخه‌های ۲۵۶ و ۳۲۰ بیت این الگوریتم نیز موجود است.

ریپمد اصلی که ۱۲۸ بیت است، بر اساس اصول MD4 عمل می‌کند و برای ارائه امنیت موارد مشکوک ایجاد شده است. ریپمد ۱۲۸ بیت به عنوان یک جایگزین برای از بین‌ بردن آسیب‌پذیری‌های ریپمد اصلی منتشر شده است. ریپمد-۱۶۰ نسخه بهبود یافته و پر استفاده این خانواده است. در نسخه‌های ۲۵۶ و ۳۲۰ بیتی، احتمال وجود اختلال کاهش یافته، اما در مقایسه با ریپمد- ۱۶۰ و ۱۲۸ بیت از سطح امنیت بالاتری برخوردار نیست.

ویرل‌پول (Whirlpool)

ویرل‌پول یه تابع هش ۵۱۲ بیتی است. این تابع از تغییر در نسخه استاندارد رمزنگاری پیشرفته (AES) ایجاد شده است. یکی از طراحان این تابع وینسنت ریمن است که از موسسان AES است. سه نسخه از ویرل‌پول منتشر شده است که عبارتند از: WHIRLPOOL-۰ و WHIRLPOOL-T، WHIRLPOOL.

ارتباط بین هشینگ و امضای دیجیتال

ارتباط بین هشینگ و امضای دیجیتال

اکنون پس از بررسی مفهوم هش، به بررسی ارتباط بین هش و امضای دیجیتال می‌پردازیم. در حوزه بلاکچین، سیستم امضای دیجیتال بر سه مرحله یا فاز اصلی معطوف هستند. این سه مرحله عبارتند از: هشینگ، امضا، بررسی و تایید. اکنون نحوه عملکرد امضای دیجیتال مبتنی بر بلاکچین را بررسی می‌کنیم.

مرحله اول: ابتدا بلاکچین، پیام‌ها یا اطلاعات و داده‌های دیجیتالی را از طریق ثبت اطلاعات هش می‌کند. ثبت اطلاعات نیز از طریق الگوریتم هشینگ انجام می‌شود. این الگوریتم به تولید یک مقدار هش یا دایجست پیام کمک می‌کند. اندازه و طول پیام‌ها ممکن است متغیر باشند، اما مقدار هش خروجی پس از هشینگ دارای مقدار ثابتی است.

مرحله دوم: مرحله بعد در عملکرد امضای دیجیتال در بلاکچین، عمل امضای پیام است. ارسال‌کننده پیام باید پس از هشینگ اطلاعات موجود در پیام، به امضای پیام مذکور بپردازد. در این مرحله، رمزنگاری کلید عمومی نقش بسیار مهمی ایفا می‌کند. بسیاری از الگوریتم‌های امضای دیجیتال مکانیزم‌های منحصربه‌فردی ارائه می‌دهند. با این حال، تمام الگوریتم‌ها، رویکرد رمزنگاری نامتقارن را اتخاذ می‌کنند. از آنجایی که امضاهای دیجیتال ارتباط مستقیمی با محتوای موجود در هر پیام دارند، پیام‌هایی که به صورت دیجیتالی امضا شده‌اند، امضاهای دیجیتال متفاوتی دارند.

مرحله سوم: مرحله آخر در خصوص استفاده از امضای دیجیتال مبتنی بر بلاکچین، بررسی و تایید است. دریافت‌کنندگان از طریق استفاده از کلید عمومی به آسانی می‌توانند صحت امضاهای دیجیتال را بررسی کنند. امضای دیجیتال می‌تواند به عنوان اثر انگشت دیجیتال منحصربه‌فرد پیام مدنظر عمل کند. هرچند توجه به ذخیره‌سازی ایمن و مدیریت کلیدها برای جلوگیری از شرایط ناخواسته نیز از اهمیت ویژه‌ای برخوردار است.

استفاده از امضای دیجیتال در بلاکچین می‌تواند به دستیابی به نتایج مهمی شامل انکارناپذیری، احراز هویت، صحت و یکپارچگی اطلاعات کمک کند. بدین ترتیب، هشینگ و امضای دیجیتال عوامل بسیار مهمی در بهبود و ارتقای امنیت برنامه‌های بلاکچینی به شمار می‌آیند.

جمع‌بندی

مهم‌ترین نکته در مورد هشینگ در بلاکچین، مبحث رمزنگاری است. رمزنگاری عبارت است از تبدیل محتوای اصلی پیام به یک رمز (Cipher)، قبل از ارسال آن پیام به دریافت‌کننده. دریافت‌کننده می‌تواند از کلیدهای خاصی استفاده کند تا رمز مذکور را رمزگشایی کند. این کلیدها فقط در اختیار دریافت‌کننده قرار دارد. بنابراین، سایر افراد نمی‌توانند در ارتباط بین ارسال‌کننده و دریافت‌کننده مداخله کند. از کاربردهای هشینگ در بلاکچین می‌توان به تامین امنیت و یکپارچگی اطلاعات، داده‌ها و کلیدها اشاره کرد. آیا نوع تابع هش بلاکچین محبوب خود را می‌شناسید؟ چه مزایا و معایبی در مقایسه با سایر توابع دارد؟ نظرات خود را با ما در میان بگذارید.

سوالات متداول (FAQ)

پرسش و پاسخ میهن بلاکچین
  • هش و تابع هش در بلاکچین چیست؟
    هش (Hash) رشته‌ای از کاراکترها با طول ثابت است که خروجی تابع هش (Hash Function) محسوب می‌شود. هش طی فرآیندی که به آن هشینگ (Hashing) گفته می‌شود، تولید می‌شود. هش اهمیت بسیاری در رمزنگاری در بلاکچین دارد و از آن در ساختارها و الگوریتم‌ داده‌ها و تولید کلیدهای عمومی و خصوصی استفاده می‌شود.
  • تابع هش چه ویژگی‌هایی دارد؟
    ورودی تابع می‌تواند طول و اندازه متفاوتی داشته باشد، اما خروجی باید طول ثبات و مشخصی داشته باشد. ابع هش شامل ویژگی برخوردناپذیری است. این ویژگی تضمین می‌کند که نمی‌توان دو پیام وجود داشته باشد چه مقدار هش یکسانی تولید کنند. تابع هش همواره یک طرفه است و مشخصا تعیین ورودی با استفاده خروجی بسیار دشوار است.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *