آموزش تابع هش (Hash Function) به زبان ساده
اولین چیزی که احتمالا با شنیدن کلمه هش به ذهن خطور میکند، رمزنگاری، ارز دیجیتال یا بیت کوین است، اما حقیقت چیز دیگری است. مفهوم هش کردن یا هشینگ عملیاتی است که از یک ورودی دلخواه، یک خروجی با اندازه ثابت تولید میشود. این کار توسط فرمولهای ریاضی خاصی به نام تابع هش انجام میشود و به کل این فرایند هشینگ میگویند.
در این مقاله سعی کردهایم مفهوم تابع هش را به زبانی ساده تشریح کنیم و شما را با اهمیت هشینگ آشنا سازیم. در ادامه با ویژگیهای تابع هش آشنا میشویم، عملکرد نوع خاصی از تابع هش به نام تابع هش رمزنگاری را بررسی میکنیم و نگاهی هم به نقش تابع هش در فرایند استخراج در بلاک چین بیت کوین میاندازیم. پیشنهاد میکنیم تا پایان ما را همراهی کنید.
هش ریت یا قدرت هش
«هش ریت » یا نرخ هش (Hash rate) به میزان سرعتی گفته میشود که «استخراجکننده» (Miner) در آن بازه، موفق به حل معمای هش شده و پاداش دریافت میکند. در شبکه بیت کوین، هش ریت سرعت اتمام عملیات محاسباتی در کد بیت کوین را نشان میدهد. هر چه نرخ هش شما بالاتر باشد، به این معناست که سریعتر میتوانید به سراغ بلاکهای بعدی بروید، در نتیجه شانستان برای دریافت جایزه بیشتر است.
حال اگر بخواهیم جور دیگری بگوییم، باید گفت که هش ریت سرعت عملکرد دستگاه استخراج را نشان میدهد. به طور کلی ماین کردن ارزهای دیجیتال شامل پیدا کردن بلاکها از طریق حل محاسبات پیچیده است، هرکدام از این بلاکها شبیه به یک پازل ریاضی است و دستگاههای ماین در هر ثانیه میلیونها بار حدس مختلف میزنند تا جواب صحیح را برای هر بلاک پیدا کنند.
در پروسه استخراج، احتمال رسیدن به هدف مورد نظر که با صفرهای زیادی شروع میشود، بسیار کم خواهد بود. به همین دلیل ماینرها مدام حدسیات خود را تغییر میدهند تا بالاخره به عدد هدف برسند. این تکرار تغییر دادن حدسهای زدهشده در ثانیه را قدرت هش دستگاه ماین میگویند که هرچه یک دستگاه در در یک ثانیه تعداد بیشتری حدس بزند، قویتر عمل میکند و قدرت هش آن نیز بیشتر خواهد بود.
برای استخراج یک بلاک و دریافت جایزه آن، نرخی که توسط دستگاه ماین حدس زده میشود، برای موفقیتآمیز بودن باید برابر یا کمتر از هدف مورد نظر باشد. بدین معنی که اگر عدد به دست آمده بیشتر از عدد هدف باشد، شما جایزهای دریافت نخواهید کرد. با تغییر درجه سختی، هدف نیز عوض خواهد شد؛ یعنی هرچقدر درجه سختی استخراج بالاتر باشد، پیدا کردن عدد مورد نظر سختتر و پیچیدهتر خواهد بود.
برای اینکه بتوان به هش مورد نظر رسید، شما به عنوان ماینر باید بعضی از هدرهای بلاک که «نانس» (Nonce) نام دارند را نیز تغییر دهید. هر کدام از نانسها با یک صفر شروع شده و به منظور رسیدن به هش یا هدف مورد نظر افزایش پیدا میکنند. نانس همان عددی است که ماینرهای بلاک چین باید به منظور حل کردن رمزنگاری بلاکها، آن را پیدا کنند.
هشینگ به چه معناست؟
«هشینگ» (Hashing) فرایندی است که ورودیهای دلخواه را به خروجیهایی با اندازه ثابت تبدیل میکند. الگویتمی که این کار را انجام میدهد «تابع هش» (Hash Function) نام دارد. درست است که تابع هش کاربرد زیادی در دنیای رمزنگاری دارد اما باید بدانیم که تمام توابع هش مخصوص رمزنگاری نیستند.
یکی از توابع هش معروف، «تابع هش رمزنگاری» (Cryptographic Hash Function) نام دارد که از آن در طراحی و پیادهسازی پروژههای دنیای ارزهای دیجیتال استفاده زیادی میشود. در قسمتهای بعدی این مقاله بیشتر در مورد این تابع صحبت میکنیم. بلاک چینها و سایر سیستمهای توزیعشده توانستهاند به کمک قابلیتهای این توابع، یکپارچگی و امنیت اطلاعات را تا سطح قابلتوجهی افزایش دهند.
تمام انواع توابع هش عملکردی قطعی و ثابت دارند. یعنی تا زمانی که ورودی یکسانی به آنها داده شود، خروجی هش یا همان «مقدار هش» (Hash value) تغییری نخواهد کرد.
ارزهای رمزنگاریشده از نوعی تابع هش یکطرفه استفاده میکنند؛ به این معنی که الگوریتم مورد استفاده آنها را نمیتوان بهراحتی معکوس کرد. به بیان سادهتر، تولید یک خروجی هش از ورودی کار آسانی است اما برعکس این کار بسیار دشوار است و نمیتوان بهراحتی از خروجی هش به مقدار اولیه رسید. به طور کلی هرچه پیدا کردن مقدار اولیه از خروجی هش کار سختتری باشد، امنیت الگوریتم هش بیشتر خواهد بود.
تابع هش چگونه کار میکند؟
ورودیهای تابع هش میتوانند هر اندازه دلخواهی داشته باشند اما خروجیهای این تابع همواره یک اندازه ثابت خواهند داشت. برای مثال الگوریتم هش SHA-256 همیشه و به ازای تمام ورودیها، خروجیهای ۲۵۶ بیتی تولید میکند، در حالی که الگوریتم SHA-1 همیشه خروجیهای ۱۶۰ بیتی تولید میکند.
برای درک بهتر این موضوع، با یک مثال واقعی بحث را ادامه میدهیم. میخواهیم یک ورودی دلخواه مثل کلمه بایننس را بهصورت انگلیسی، یکبار بهصورت Binance و یکبار binance به تابع هش SHA-256 بدهیم و ببینیم چه خروجیهایی تولید میشود. از این تابع در شبکه بیت کوین نیز استفاده شده است.
خروجی ۲۵۶ بیتی | ورودی SHA-256 |
f1624fcc63b615ac0e95daf9ab78434ec2e8ffe402144dc631b055f711225191 | Binance |
59bba357145ca539dcd1ac957abc1ec5833319ddcae7f5e8b5da0c36624784b2 | binance |
همانطور که مشاهده میکنید، فقط اولین حرف ورودیها در کلمه بایننس با هم متفاوت نوشته شده است. یعنی یک بار با حروف بزرگ انگلیسی و یک بار با حروف کوچک به تابع هش داده شده، ولی دو خروجی کاملا متفاوت به دست آمده است. خروجیهای این تابع به ازای تمام ورودیها، همواره ۲۵۶ بیت (یا ۶۴ کاراکتر) خواهد بود و تا زمانی که ورودی تغییر نکند، خروجی تغییر نخواهد کرد.
حالا اگر همین مثال را در مورد تابع هش SHA-1 تکرار کنیم، به نتایج زیر میرسیم.
خروجی ۱۶۰ بیتی | ورودی SHA-1 |
7f0dc9146570c608ac9d6e0d11f8d409a1ee6ed1 | Binance |
e58605c14a76ff98679322cca0eae7b3c4e08936 | binance |
اینجا هم میبینیم که با تغییر تنها یک حرف در ورودی تابع، خروجی کاملا متفاوتی تولید شده و اندازه هر دو خروجی مقدار ثابت ۱۶۰ بیت است.
جالب است بدانیم که عبارت SHA کوتاهشده سه کلمه Secure Hash Algorithms به معنی «الگوریتمهای هش ایمن» است و شامل مجموعهای از توابع هش با الگوریتمهای متفاوت میشود. از جمله توابع هش میتوان SHA-0 ،SHA-1 ،SHA-2 ،SHA-256 و SHA-512 را نام برد.
تابع هش رمزنگاری
تا اینجا متوجه شدیم که تابع هشی که از الگوریتمهای رمزنگاری برای ساخت خروجی استفاده کند، تابع هش رمزنگاری نامیده میشود. بهطور کلی تشخیص الگوریتم هش رمزنگاری و شکستن کد آن، کار بسیار سختی بوده و نیاز به توان پردازشی قابل توجهی است. در حقیقت اگر شخصی بخواهد فرایند تابع هش رمزنگاری را معکوس کند و از مقدار هش، ورودی تابع را بدست آورد، باید آنقدر ورودیهای مختلف را به صورت آزمون و خطا به تابع بدهد تا اینکه یکی از ورودیها، همان خروجی موجود را تولید کند. البته در این بین مفهومی به نام «تصادم» (Collision) وجود دارد و طبق آن، ممکن است برای دو ورودی متفاوت، خروجی یکسانی تولید شود.
بهطور کلی وجود سه شرط برای امن بودن عملکرد تابع هش رمزنگاری ضروری است. این سه شرط عبارتند از: (متأسفانه ترجمه مناسبی برای برخی از این واژهها موجود نیست و به همین دلیل از عبارات انگلیسی استفاده شدهاست)
- Collision resistance: نباید برای دو ورودی مختلف، یک خروجی یکسان تولید شود.
- Preimage resistance: نباید بتوان الگوریتم تابع را معکوس کرد و از خروجی موجود، ورودی اولیه را پیدا کرد.
- Second-Preimage resistance: نباید بتوان ورودی دیگری را یافت که خروجی مشابهی با ورودی قبلی داشته باشد.
اگر درک این سه مفهوم کمی دشوار به نظر میرسد، در ادامه با ما همراه باشید تا در مورد آنها بیشتر صحبت کنیم.
Collision resistance یا مقاومت در برابر تصادم
گفتیم که تصادم زمانی رخ میدهد که برای دو ورودی مختلف، مقدار هش یکسانی تولید شود. پس هر تابع هش را میتوانیم مقاوم در برابر تصادم در نظر بگیریم تا زمانی که یک نفر بتواند یک تصادم پیدا کند. باید توجه داشته باشیم که تابع هشی وجود ندارد که امکان تصادم در آن صفر باشد؛ علت این است که همیشه تعداد ورودیها بینهایت است، در صورتی که خروجی تابع یک مقدار محدود است.
به بیان دیگر، زمانی به تابع هش، مقاوم در برابر تصادم گفته میشود که احتمال رخ دادن تصادم بسیار کم باشد و برای پیدا کردن آن، میلیونها سال زمان لازم باشد. پس با وجود اینکه میدانیم هیچ الگوریتم کاملا مقاومی در برابر تصادم وجود ندارد، میتوانیم بعضی از آنها مثل SHA-256 را آنقدر قابل اعتماد بدانیم که از آن به عنوان تابع هش مقاوم در برابر تصادم استفاده کنیم.
در بین الگوریتمهای مختلف SHA، لازم است بدانیم که SHA-0 و SHA-1 دیگر جزء موارد ایمن حساب نمیشوند چون تصادم در آنها پیدا شده است. در حال حاضر الگوریتمهای دسته SHA-2 و SHA-3 جزء موارد مقاوم در برابر تصادم شناخته میشوند.
Preimage resistance
این قابلیت با مفهوم عملگرد یکطرفه تابع هش و عدم معکوسپذیری این فرایند در ارتباط است. تابع هش زمانی این مقاومت را دارد که احتمال اینکه شخصی بتواند از روی یک خروجی مشخص، ورودی اولیه را پیدا کند بسیار کم باشد.
این مفهوم با مورد قبلی که تصادم نام داشت متفاوت است؛ در اینجا هکر تلاش میکند با نگاه کردن به مقدار خروجی، ورودی اولیه را حدس بزند؛ اما تصادم زمانی رخ میدهد که یک نفر بتواند برای دو ورودی متفاوت، یک مقدار هش به عنوان خروجی پیدا کند. یعنی دیگر مهم نباشد که از کدام ورودی استفاده میشود چون هر دو یک مقدار هش خواهند داشت.
قابلیت Preimage resistance درحفاظت از دادهها اهمیت زیادی دارد؛ زیرا با استفاده از مقدار هش، میتوان بدون افشای اطلاعات از صحت آنها اطمینان حاصل کرد. بسیاری از ارائهدهندگان خدمات اینترنتی و برنامههای تحت وب بهجای استفاده از کلمههای عبور اصلی، مقدار هش آنها را ذخیره و استفاده میکنند.
Second-Preimage resistance
این مورد را میتوان به نوعی ترکیبی از موارد قبلی در نظر گرفت. به بیان ساده، یک حمله Second-preimage زمانی اتفاق میافتد که شخصی بتواند با یک ورودی، دقیقا خروجیای را تولید کند که قبلا با ورودی دیگری تولید شده باشد. در این حالت، حمله کننده به دنبال یافتن یک تصادم است: اما به جای اینکه دنبال حدس زدن دو ورودی باشد که هش یکسانی داشته باشد، تلاش میکند ورودی خاصی را پیدا کند که هشی را تولید کند که قبلا توسط ورودی دیگری تولید شده است. (شاید برای درک دقیق این موارد نیاز باشد این قسمت از متن را چند بار بخوانید!)
پس میتوان اینطور نتیجه گرفت که تابع هشی که در برابر تصادم مقاوم باشد، در برابر حملات Second-preimage هم مقاوم خواهد بود چون این حمله همیشه با تصادم همراه است. به هر حال باید توجه داشته باشیم که همواره احتمال رخ دادن حمله Preimage به تابع مقاوم در برابر تصادم وجود دارد و شاید حملهکننده بتواند از روی خروجی، ورودی اولیه را پیدا کند.
هشینگ مناسب چه کسانی است؟
حالا که با مفهوم هشینگ و کاربرد آن آشنا شدید، بهتر است بدانید که فرآیند هشینگ مناسب چه کسانی است. هر روزه اکثر کاربران در خصوص رمز عبور خود، فرآیند هشینگ را به کار میبرند. برای مثال زمانی که قصد دارید، آدرس ایمیل و گذرواژهای برای خود بسازید، سایتی که در آن اقدام به ساختن ایمیل جدید کردهاید، رمز عبور شما را به همان شکل ذخیره نخواهد کرد بلکه آن را با استفاده از یک الگوریتم هشینگ به اجرا در میآورد.
سپس هش رمز عبور شما را در خود ذخیره میکند. پس از آن هرباری که شما قصد ورود به ایمیل خود را داشته باشد، سایت پذیرنده رمز عبور وارد شده را تبدیل به هش خواهد کرد و آن را با هشی که قبلا ذخیره کرده، مقایسه میکند. فقط در صورتی که هش وارد شده و هش ذخیرهشده با هم مطابقت داشته باشند، شما مجاز به ورود به ایمیلتان هستید.
عوامل موثر در نرخ هش یا هش ریت
یکی از مهمترین عوامل مؤثر روی نرخ هش، الگوریتم انتخابشده برای استخراج ارز دیجیتال مورد نظر است. به عنوان مثال، برخی از دستگاهها در شبکههایی که الگوریتم SHA دارند (مانند بیت کوین، «پیرکوین» (Peercoin)، «نِیم کوین» (Namecoin) بهترین عملکرد را نشان میدهند، ولی کارایی همان دستگاهها برای استفاده از الگوریتم «اسکریپت» (Scrypt) مانند «لایت کوین» (litecoin)، «دوج کوین» (Dogecoin)، «گرید کوین» (Gridcoin) بسیار کم خواهد بود. پس برای استخراج ارز دیجیتال مورد نظرتان باید دستگاه مناسب همان ارز را انتخاب کنید.
همچنین مشخصات دستگاه نیز از عوامل بسیار مؤثر در نرخ هش است که بسته به سازنده آن ممکن است ویژگیهای متفاوتی داشته باشد. اگر قصد خرید دستگاه ماین را دارید، میتوانید مشخصات آن را به طور دقیق مطالعه کرده تا بهترین دستگاه را که مناسب با هدف شماست تهیه کنید.
همچنین قیمت و محبوبیت ارز دیجیتال مورد نظر را فراموش نکنید. هرچه ارز دیجیتال انتخابی شما محبوبتر باشد، ماینرهای بیشتری برای استخراج آن در رقابت خواهند بود، که به این معناست که «سختی استخراج» (Mining Difficulty) بیشتر خواهد شد؛ زیرا زمان پیدا کردن هر بلاک باید ثابت بماند (مثلا برای بیت کوین ۱۰ دقیقه است).
به بیان سادهتر هرچقدر یک ارز دیجیتال محبوبتر باشد، تعداد استخراجکنندگان آن نیز بالاتر میرود و از آنجا که این مسئله باعث میشود زمانِ رسیدن به جواب کاهش پیدا کند (در حالی که این زمان باید ثابت باشد) پس سختی استخراج وارد عمل میشود و با بالا رفتن آن، زمان رسیدن به جواب ثابت باقی میماند، در این حالت هش ریت کل شبکه بیشتر میشود.
اگر میزان هش ریت کل شبکه بالا باشد، برای خود ارز دیجیتال بهتر خواهد بود؛ چرا که امنیت شبکه را بالا میبرد. اگر کسی قصد هک کردن شبکه بیت کوین را داشته باشد، به ۵۱ درصد از قدرت هش کل شبکه نیاز دارد که با در نظر گرفتن تعداد بیشمار دستگاههای ماین در سرتاسر جهان چنین چیزی ممکن نیست. به این نوع از حمله، «حمله ۵۱ درصدی» (51% Attack) میگویند.
برای درک بهتر این موضوع، یک دستگاه ماین بیت کوین را در نظر بگیرید که با سخت افزار ASIC، قدرت ماینی برابر با ۱۲ تِراهش در ثانیه را دارد. با توجه به سختی حال حاضر شبکه بیت کوین، این دستگاه میتواند ۰.۳۱۸ بیت کوین در سال تولید کند.
سخن پایانی
هش ریت میزان قدرت دستگاه که به منظور استخراج بیت کوین در سرتاسر جهان مورد استفاده قرار میگیرد را محاسبه میکند. ماینرها با استفاده از قدرت پردازش دستگاه خود، ایمنی شبکه را تأمین کرده و تمام معاملات بیت کوین را ثبت میکنند. در آخر به ازای تلاش خود جایزه خواهند گرفت.
هرچه نرخ هش دستگاه ماین بالاتر باشد، ارز دیجیتال بیشتری استخراج میشود ولی هرچه میزان هش ریت کل شبکه بالاتر برود، نیاز به ماشینهای قدرتمندتری خواهد بود و کل فرآیند استخراج سختتر خواهد شد.
در حالت کلی میتوان گفت که هش ریت راهی برای اندازهگیری امنیت یک شبکه است. عوامل زیادی در اندازهگیری این نرخ هش تأثیرگذار هستند که بالاتر به برخی از آنها مانند سختی شبکه، محبوبیت ارز دیجیتال، انتخاب دستگاه ماین و الگوریتم مورد استفاده اشاره شد.
برای دریافت مشاوره تخصصی رایگان از کارشناسان ما، اطلاعات خواسته شده رو تکمیل فرمایید.