وقتی میخواهیم درباره رمزنگاری و امنیت بلاکچین حرف بزنیم، محال است که به مفهوم هش (Hash) و هشینگ برنخوریم. هش در کنار امضای دیجیتال یک مولفه اساسی در تامین امنیت تکنولوژی بلاکچین است. اهمیت اصلی آنها در فراهمسازی مکانیسمی برای تایید اصالت فایلها و جلوگیری از دستکاری توسط شخصی غیر از مولف است. در ادامه این مقاله از میهن بلاکچین به این میپردازیم که هش، تابع هش (Hash Function) و هشینگ چیستند و چه ویژگیهایی دارند.
هش در بلاکچین چیست؟
کاربران گرامی میهن بلاکچین، در صورتی که ویدیوی این مطلب برای شما بهنمایش درنمیآید، VPN خود را خاموش کرده و سپس صفحه را رفرش کنید. بعضی ویدیوهای سایت آپارات برای IPهای خارج از ایران به نمایش درنمیآید.
یکی از مواردی که هنگام مواجه با این مفهوم به چشم میخورد سه عبارت هش، تابع هش و هشینگ است. این سه عبارت در عین درهمتنیدگی کارکرد، از نظر مفهوم با یکدیگر متفاوت هستند. هش (Hash) در علوم کامپیوتر و کریپتوگرافی، رشتهای با طول ثابتی از کاراکترها است که توسط تابعی ریاضی به نام تابع هش (Hash Function) تولید میشود. ورودی تابع هش که به آن مسیج یا پیام (Message) گفته میشود، میتواند طول نامحدود داشته باشد (مثلا به کوچکی یک کاراکتر یا به بزرگی تمام اطلاعات روی اینترنت). اما خروجی یا هش، همیشه طول ثابت دارد. هشینگ (Hashing) به فرآیند ورود داده یا پیام به منظور تولید رشتهای از کاراکترها یا هش گفته میشود. یک ورودی یکسان همیشه خروجی هش یکسان دارد. اما کوچکترین تغییری در ورودی منجر به تولید هش متفاوت میشود. بنابراین:
تابع هش: 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 شود، باید دشوار باشد.
- چون تابع هش یک تابع فشردهساز با خروجی ثابت است، نداشتن تصادم برای آن غیرممکن است. این ویژگی تنها بیان میکند که پیدا کردن این تصادمها باید بسیار سخت باشد.
نحوه محاسبه هش در بلاکچین
هشها در بلاک چین برای نشان دادن حالت فعلی کاربرد دارند؛ یعنی ورودی تابع، کل حالت فعلی بلاکچین است که شامل تمام تراکنشهایی که از ابتدا تاکنون صورت گرفته است. این تراکنشها به عنوان ورودی هش میشوند (طی فرآیند 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) گفته میشود، تولید میشود. هش اهمیت بسیاری در رمزنگاری در بلاکچین دارد و از آن در ساختارها و الگوریتم دادهها و تولید کلیدهای عمومی و خصوصی استفاده میشود.
- تابع هش چه ویژگیهایی دارد؟
ورودی تابع میتواند طول و اندازه متفاوتی داشته باشد، اما خروجی باید طول ثبات و مشخصی داشته باشد. ابع هش شامل ویژگی برخوردناپذیری است. این ویژگی تضمین میکند که نمیتوان دو پیام وجود داشته باشد چه مقدار هش یکسانی تولید کنند. تابع هش همواره یک طرفه است و مشخصا تعیین ورودی با استفاده خروجی بسیار دشوار است.