هش کردن به فرایند تولید یک خروجی در اندازه ثابت از ورودی با اندازه متغیر اطلاق میشود. این کار با استفاده از فرمول های ریاضی معروف به توابع هش (به عنوان الگوریتم های هش کردن) انجام میشود.
اگرچه همه توابع هش شامل استفاده از رمزنگاری نیستند، اما اصطلاحاً توابع هش رمزنگاری در هسته ارزهای دیجیتال قرار دارند. به لطف آنها، بلاکچین ها و سایر سیستم های توزیع شده می توانند به سطح قابل توجهی از یکپارچگی و امنیت داده ها دست یابند.
هر دو عملکرد هش معمولی و رمزنگاری قطعی هستند. قطعی بودن به این معنی است که تا زمانی که ورودی تغییر نکند، الگوریتم هش کردن همیشه همان خروجی را تولید می کند (همچنین به عنوان digest یا هش شناخته میشود).
به طور معمول، الگوریتم های هش کردن ارزهای دیجیتالی به صورت توابع یک طرفه طراحی میشوند، بدین معنی که بدون مقادیر زیاد زمان و منابع محاسباتی، نمیتوان آنها را به راحتی برگرداند. به عبارت دیگر، ایجاد خروجی از ورودی کاملاً آسان است، اما حرکت در جهت مخالف (تولید ورودی از خروجی به تنهایی) نسبتاً دشوار است. به طور کلی، هرچه پیدا کردن ورودی سخت تر باشد، الگوریتم هشینگ ایمن تر به نظر میرسد.
عملکرد هش چگونه کار می کند؟
توابع هش مختلف خروجی هایی با اندازه های متفاوت تولید میکنند، اما اندازه های خروجی برای هر ورودی هش شده، همیشه ثابت است. به عنوان مثال، الگوریتم SHA-256 فقط میتواند ۲۵۶ بیت خروجی تولید کند، در حالی که SHA-1 همیشه هش ۱۶۰ بیتی ایجاد میکند.
برای توضیح، بیایید کلمات “pingi” و “Pingi” را از طریق الگوریتم هش SHA-256 (الگویی که در بیت کوین استفاده میشود) اجرا کنیم.
SHA-256
input | Output (256 bits) |
pingi | 09229070b9bd852ebe62adbdb87eba2d095e7a061cd5a67077b0cf0d91afcdc2 |
Pingi | 82a1ae0e1d5aa4bd426020d20e5fa514a9952af9fb57fe6f164afeffaca59519 |
توجه داشته باشید که یک تغییر جزئی (حرف اول) منجر به یک مقدار هش کاملا متفاوت میشود. اما از آنجا که ما از SHA-256 استفاده می کنیم، خروجی ها همیشه یک اندازه ثابت ۲۵۶ بیت (یا ۶۴ کاراکتر) خواهند داشت (صرف نظر از اندازه ورودی). پس مهم نیست که چند بار دو کلمه را از طریق الگوریتم اجرا کنیم، هربار دو خروجی ثابت میمانند.
برعکس، اگر ورودی های مشابه را از طریق الگوریتم هش SHA-1 اجرا کنیم، نتایج زیر را خواهیم داشت:
SHA-1
Input | Output (160 bits) |
pingi | 81b4b3a22e0f1341696ec12f24d999e39178638d |
Pingi | f5e36baf2a790d37b483c97101770e9c44fc184c |
قابل ذکر است، کلمه ی SHA مخفف Secure Hash Algorithms است. این به مجموعه ای از توابع هش رمزنگاری اشاره دارد که شامل الگوریتم های SHA-0 و SHA-1 به همراه گروه های SHA-2 و SHA-3 میباشد. SHA- 256 بخشی از گروه SHA-2 است، همراه با SHA-512 و انواع دیگر. در حال حاضر، فقط گروه های SHA-2 و SHA-3 امن در نظر گرفته شده اند.
چرا آنها مهم هستند؟
توابع هش معمولی موارد استفاده ی زیادی دارند، بطور مثال برای بهبود عملکرد جستجوی پایگاه داده، تجزیه و تحلیل پرونده های بزرگ و مدیریت داده ها است. از طرف دیگر، توابع هش رمزنگاری به طور گسترده ای در برنامه های امنیتی اطلاعات، مانند تأیید اعتبار پیام و اثر انگشت دیجیتال استفاده می شود. وقتی صحبت از بیت کوین میشود، توابع هش رمزنگاری یک بخش اساسی از فرآیند استخراج است و همچنین در تولید آدرس ها و کلیدهای جدید نقش دارد.
قدرت واقعی هش در هنگام برخورد با حجم عظیمی از اطلاعات حاصل میشود. به عنوان مثال، میتوان از طریق یک تابع هش، یک فایل بزرگ یا مجموعه داده را اجرا کرد و سپس از خروجی آن استفاده کرد تا سرعت و صحت اطلاعات را به سرعت بررسی کند. این امر به دلیل ماهیت تعیین کننده توابع هش امکان پذیر است: ورودی همیشه به خروجی ساده و فشرده شده (هش) منجر میشود. چنین تکنیکی نیاز به ذخیره و “به خاطر سپردن” مقدار زیادی از داده ها را برطرف میکند.
هش کردن در زمینه فنآوری بلاک چین مفید است. بلاکچین بیت کوین (BTC) چندین عملیات دارد که شامل هش کردن است، بیشتر آنها در فرآیند استخراج است. در حقیقت، تقریباً تمام پروتکل های ارز دیجیتال برای ایجاد پیوند و متراکم کردن گروه های معاملات به بلوک، و همچنین برای ایجاد پیوندهای رمزنگاری بین هر بلوک، به ایجاد بلاکچین متکی هستند.
توابع هش رمزنگاری
همچنین یک تابع هش، که از تکنیک های رمزنگاری استفاده میکند، ممکن است به عنوان یک تابع هش رمزنگاری تعریف شود. به طور کلی، شکستن یک عملکرد هش رمزنگاری نیاز به تلاش حمله جستجوی فراگیر بی شماری دارد. برای این که شخص بتواند یک عملکرد هش رمزنگاری را برگرداند، باید تا زمانی که خروجی مربوطه تولید شود، حدس بزند که ورودی توسط آزمایشی و خطا چیست. با این وجود، امکان این که دو ورودی متفاوت، یک خروجی مشابه را تولید کنند نیز وجود دارد که در این صورت “تصادم” (collision) رخ میدهد.
از نظر فنی، یک عملکرد هش رمزنگاری نیاز به پیروی از سه ویژگی دارد تا از نظر ایمنی امن در نظر گرفته شود. ما ممکن است این ویژگی ها را به عنوان مقاومت در برابر برخورد، مقاومت در برابر حمله preimage و مقاومت در برابر حمله دوم preimage توصیف کنیم.
قبل از بحث درباره هر ویژگی، بگذارید منطق آنها را در سه جمله کوتاه خلاصه کنیم.
- مقاومت در برابر تصادم: برای یافتن هر دو ورودی مجزا که همان هش خروجی را تولید می کنند غیرقابل اجرا است.
- مقاومت در برابر حمله preimage: غیرفعال کردن برای برگرداندن عملکرد هش (ورودی را از یک خروجی معین پیدا کنید).
- مقاومت در برابر حمله دوم preimage: برای یافتن هر ورودی دوم که با ورودی مشخص برخورد می کند غیرقابل اجرا است.
مقاومت در برابر تصادم
همانطور که گفته شد، برخورد یا تصادم زمانی اتفاق میافتد که ورودی های مختلف دقیقاً خروجی هش یکسانی تولید کنند. بنابراین، یک تابع هش تا زمانی که کسی تصادم پیدا کند، مقاوم در برابر تصادم تلقی میشود. توجه داشته باشید که برخورد یا تصادم برای هر تابع هش همیشه وجود خواهد داشت زیرا ورودی های احتمالی بی نهایت هستند، در حالی که خروجی های ممکن محدود هستند.
به عبارت دیگر، هنگامی که امکان یافتن تصادم آنقدر کم باشد که میلیون ها سال به محاسبات نیاز داشته باشد، یک عملکرد هش مقاوم در برابر برخورد است. بنابراین علیرغم این واقعیت که هیچ عملکرد هش بدون برخورد وجود ندارد، برخی از آنها به اندازه کافی قوی هستند که بتوان آن را مقاوم دانست به عنوان مثال، SHA-256)).
در میان الگوریتم های مختلف SHA، گروه های SHA-0 و SHA-1 دیگر ایمن نیستند زیرا در آن ها تصادم پیدا شده است. در حال حاضر، گروه های SHA-2 و SHA-3 در برابر برخوردها مقاوم به حساب می آیند.
مقاومت در برابر حمله preimage
خاصیت مقاومت در برابر حمله preimage به مفهوم توابع یک طرفه مربوط میشود. یک تابع هش هنگامی که احتمال بسیار کمی برای پیدا کردن ورودی خروجی خاص وجود داشته باشد، یک عملکرد هش در نظر گرفته میشود.
توجه داشته باشید که این ویژگی با ویژگی قبلی متفاوت است زیرا یک مهاجم سعی میکند با دیدن یک خروجی داده شده، ورودی را حدس بزند. از طرف دیگر، تصادم هنگامی رخ میدهد که کسی دو ورودی متفاوت پیدا کند که یک خروجی را تولید میکنند، اما مهم نیست که از کدام ورودی ها استفاده شده است.
خاصیت مقاومت در برابر حمله preimage برای محافظت از داده ها بسیار ارزشمند است زیرا یک هش ساده از یک پیام بدون نیاز به افشای اطلاعات میتواند صحت آن را اثبات کند.
مقاومت در برابر حمله دوم preimage
برای ساده سازی، ممکن است بگوییم که مقاومت در برابر حمله دوم preimage در جایی بین دو ویژگی دیگر است. حمله دوم preimage وقتی رخ میدهد که شخصی قادر به یافتن یک ورودی خاص باشد که همان خروجیِ ورودی دیگری را که از قبل میداند تولید میکند.
به عبارت دیگر، یک حمله preimage دوم شامل یافتن تصادم است، اما آنها به جای جستجوی دو ورودی تصادفی که هش یکسان تولید میکنند، ورودی را جستجو میکنند که همان هش تولید شده توسط ورودی خاص دیگری را ایجاد میکند.
بنابراین، هر عملکرد هش مقاوم در برابر برخورد نیز در برابر حملات preimage دوم مقاوم است، زیرا دومی همیشه حاکی از تصادم است. با این حال، هنوز هم میتوان یک حمله preimage را به عملکرد مقاوم در برابر تصادم انجام داد زیرا این امر به معنای یافتن یک ورودی واحد از یک خروجی است.
ماینینگ
مراحل مختلفی در استخراج بیت کوین وجود دارد که شامل توابع هش مانند چک کردن مانده بیت کوین، پیوند دادن ورودی ها و خروجی های معاملات و ایجاد معاملات در یک بلوک برای تشکیل درخت Merkle است. اما یکی از دلایل اصلی امنیت بلاکچین بیت کوین این واقعیت است که ماینرها برای انجام یافتن راه حل معتبر برای بلاک بعدی نیاز به انجام عملیات هش بی شمار دارند.
یک ماینر هنگام ایجاد یک مقدار هش برای بلوک کاندید خود، باید چندین ورودی مختلف را امتحان کند. در اصل، آنها فقط در صورت ایجاد یک هش خروجی که با تعداد معینی صفر شروع می شود، میتوانند اعتبار خود را تأیید کنند. تعداد صفرها چیزی است که دشواری استخراج را تعیین میکند و بسته به میزان هش اختصاص داده شده به شبکه متفاوت است.
در این حالت، هش ریت (hash rate) نشان دهنده میزان سرمایه گذاری کامپیوتر در استخراج بیت کوین است. اگر میزان هش شبکه افزایش یابد، پروتکل بیت کوین به طور خودکار مشکل استخراج را تنظیم میکند تا میانگین زمان لازم برای استخراج یک بلوک نزدیک به ۱۰ دقیقه باقی بماند. در مقابل، اگر چندین ماینر تصمیم بگیرند که استخراج را متوقف کنند، و باعث کاهش قابل توجه میزان هش شود، مشکل استخراج تنظیم میشود و استخراج آن آسان تر میشود (تا زمانی که زمان بلوک متوسط به ۱۰ دقیقه برسد).
توجه داشته باشید که ماینرها نیازی به تصادم ندارند زیرا چندین هش وجود دارد که میتوانند به عنوان یک خروجی معتبر تولید کنند (شروع آن با تعداد مشخصی صفر). بنابراین چندین راه حل ممکن برای یک بلوک خاص وجود دارد و ماینر ها فقط باید یکی از آنها را پیدا کنند.
از آنجا که استخراج بیت کوین یک کار هزینه بر است، ماینر ها دلیلی برای تقلب در سیستم ندارند زیرا این امر منجر به ضررهای مالی قابل توجهی میشود. هر چه ماینرها بیشتر به بلاک چین بپیوندند، بزرگتر و قوی تر میشود.
سخن نهایی
شکی نیست که توابع هش ابزاری اساسی در علم رایانه است، به خصوص هنگام برخورد با حجم عظیمی از داده ها. الگوریتم های هش کردن هنگامی که با رمزنگاری ترکیب شوند، میتوانند کاملاً متنوع باشند، امنیت و احراز هویت را به روش های مختلفی ارائه میدهند. به همین ترتیب، عملکردهای هش رمزنگاری تقریباً برای همه شبکه های رمزنگاری ضروری است، بنابراین درک ویژگی های آنها و مکانیسم های کار مطمئناً برای هر کسی که علاقه مند به فنآوری بلاک چین باشد، مفید است.