آنچه در این مقاله خواهید خواند
هشینگ یکی از مهمترین فرآیندها در رمزنگاری بلاک چین است. با انواع تابع و الگوریتم های هشینگ (Hashing) آشنا شده و نحوه کار آن را درک میکنیم. تا انتهای این مقاله متوجه خواهید شد هش چیست، هشینگ چیست و چرا بلاک چین شدید به آنها وابسته است؟
مقدمهای بر فرآیند هشینگ ؛ هش یعنی چه؟
هشینگ فرآیند ایجاد یک خروجی با اندازه ثابت از یک ورودی با اندازه متغیر است. به عبارتی داده وارد شده میتواند هر اندازهای داشته باشد، اما بدون توجه به آن، داده به دست آمده همیشه اندازه ثابتی دارد. پس تابع هش چیست؟ کاری که در مرحله قبل گفتیم به وسیله استفاده از یک سری فرمولهای ریاضی به نام توابع هش انجام میشود. این تابعها در قالب الگوریتمهای Hashing پیاده میشوند.
برای درک این دو مفهوم باید بدانید یک الگوریتم، مجموعهای از دستورالعملها است. در علوم کامپیوتر، یک تابع پیادهسازی یک الگوریتم به شمار میرود. یک Algorithm یک فرآیند بوده و تعدادی مرحله را برای انجام یک محاسبه شامل میشود، اما یک Function (تابع) رابطه ریاضی بین پارامترها و نتایج است. به عبارت دیگر، الگوریتم روشی تئوری درباره چگونگی حل مسئله و تابع، پیادهسازی آن در عمل است.
اگرچه در همه توابع هش، از رمزنگاری استفاده نمیشود، اما اصطلاحا توابع هش رمزنگاری، در مرکز رمز ارزها قرار داشته و جزوی جدانشدنی از آنها به شمار میروند. به لطف این الگوریتمها، سیستمهای قدرت گرفته از فناوری بلاک چین و دیگر سیستمهای توزیع شده به سطوح بالایی از یکپارچگی و امنیت داده دست پیدا میکنند.
توابع هشینگ معمولی و رمزنگاری، قطعی هستند. قطعی بودن به این معنی است که تا زمان عدم تغییر ورودی، الگوریتم همیشه خروحی یکسانی تولید خواهد کرد. خروجی به دست آمده از تابع Hashing، یک هش (Hash) نام دارد.
به طور معمول الگوریتمهای هشینگ رمز ارزها به صورت توابع یک طرفه طراحی میشوند، به این معنی که امکان برگرداندن (رسیدن از خروجی به ورودی) بسیار دشوار بوده و در اغلب مواقع به سالها پردازش نیاز دارد! این موضوع سبب میشود مشخص کردن ورودی بر اساس هش در دسترس، تقریبا غیر ممکن باشد. به راحتی میتوان قطعهای دیتا را وارد تابع و یک خروجی تولید کرد، اما بالعکس آن بسیار دشوار و در بیشتر مواقع کاملا غیر ممکن است. هر چه رسیدن به داده اولیه بر اساس هش دشوارتر باشد، الگوریتم هشینگ مورد استفاده ایمنتر محسوب میشود.
هشینگ ساده و در عین حال پیچیده است!
اگر تصور میکنید “c017dcaadb04d44b6012b2a055786c77″یک مشت کاراکتر بیارزش است، سخت در اشتباه هستید. رشته کاراکترهای جمله قبل، غزل 18 ویلیام شکسپیر به عنوان یکی از معروفترین اشعار وی است! نظرتان درباره “e10adc3949ba59abbe56e057f20f883e” چیست؟ اگر آن را پیشتر در یک پایگاه داده دیدهاید، یک نفر در گوشهای از دنیا در خطر است، چرا که شکل متفاوت “123456” به عنوان یکی از خطرناکترین و قابل حدسترین پسوردهای دنیا محسوب میشود! هر یک از دو مجموعه اعداد و حروفی که در بالا مشاهده کردیم یک هش نام دارند.
در آشپزی، Hashing به معنی خرد و سپس مخلوط کردن یک چیز است. در علوم کامپیوتر، هشینگ معنی تقریبا یکسانی دارد. در اینجا یک کامپیوتر قطعهای داده را بدون توجه به طولش دریافت کرده و با استفاده از فرمولهای ریاضی، آن را خرد و مخلوط میکند. نتیجه همیشه دارای طول ثابت است و به اندازه ورودی بستگی ندارد. به همین دلیل طول هش شش کاراکتر “123456” با هش غزل چهارده خطی ویلیام شکسپیر یکسان شد.
از تقریبا هر محتوای دیجیتال نظیر یک سند، یک تصویر، یک فایل صوتی نظیر موزیک یا هر چیز دیگر میتوان یک هش تولید کرد. هر محتوای دیجیتال در عمل و در پایینترین سطح، چیزی به جز یک مشت 0 و 1 نیست. با در نظر گرفتن این شباهت، تولید هش هر نوع داده امکانپذیر میشود.
فرمولهای ریاضی زیادی برای هشینگ و تولید هش وجود دارند. هر تابع به شکلی متفاوت مقادیر ورودی را خرد و مخلوط میکند، به همین دلیل خروجی هر یک نسبت به دیگری (با در نظر گرفتن استفاده از یک ورودی ثابت) متفاوت است. طول خروجی یا همان Hash بسته به تابع مورد استفاده متفاوت خواهد بود. برخی از آنها نتیجهای بسیار طولانی ایجاد میکنند. به عنوان مثال میتوان به فانکشن SHA-512 اشاره کرد که داده بیرون آمده از آن متشکل از 128 کاراکتر (512 بیت) است.
از آن جایی که وارد کردن یک مقدار مشخص داخل یک تابع هش حتی برای چند مرتبه، همیشه به تولید یک خروجی مشابه در هر دفعه منجر میشود، میتوان Hash را به اثر انگشت یک محتوای دیجیتال تشبیه کرد. برای درک بهتر، مثال زیر را در نظر بگیرید.
اولین خط غزل 18 ویلیام شکسپیر جمله “Shall I Compare Thee To a Summer’s Day” است. همانطور که در بالا گفتیم، هش کل غزل، حاوی چهارده خط، “c017dcaadb04d44b6012b2a055786c77” میشود. اگر فقط کلمه Summer در خط اول را به Winter تغییر بدهیم، هش کل غزل زیر و رو و تبدیل به “ab7b6da7342ea2599198c3ba3e884b55” خواهد شد. جالب است بدانید نه تنها تغییر یک کلمه یا حتی حرف، بلکه عوض کردن بزرگی – کوچکی یک حرف در یک کلمه (مثل نوشتن summer به جای Summer) نیز منجر به تولید یک خروجی کاملا متفاوت خواهد شد. با توجه به این موضوع، میتوان Hash را مصداق واقعی اثر انگشت یک محتوای دیجیتال دانست!
یک تابع هش چطور کار میکند؟
توابع هش مختلف، خروجیهایی با طول متفاوت تولید میکنند، اما طول داده به دست آمده از انتهای یک تابع Hashing معین همیشه ثابت است. به عنوان نمونه، الگوریتم SHA-256 فقط قادر است خروجیهایی 256 بیتی تولید کند. اندازه هش به دست آمده از الگوریتم دیگری به نام SHA-1 همیشه 160 بیت است.
برای درک بهتر، دو کلمه “Binance” و “binance” را وارد تابع هشینگ SHA-256 میکنیم. گفتنی است از آن در نخستین و محبوبترین رمز ارز دنیا یعنی بیت کوین به طور گسترده استفاده میشود.
همانطور که مشاهده میکنید، یک تغییر کوچک نظیر عوض کردن بزرگی – کوچکی تنها یک حرف کلمه، سبب تولید یک هش کاملا متفاوت خواهد شد. اما از آن جایی که در حال استفاده از الگوریتم SHA-256 هستیم، داده حاصل شده در انتها همیشه 256 بیتی (64 کاراکتری) است. این موضوع ربطی به طول داده اولیه نداشته و بدون توجه به آن، هش همیشه دارای همین اندازه خواهد بود. همچنین تعداد دفعات تکرار الگوریتم هشینگ SHA-256 روی دو کلمه بیاهمیت است، چرا که همیشه خروجی یکسانی تولید میشود.
اگر دو کلمه بالا را داخل الگوریتم هشینگ SHA-1 قرار بدهیم، دو هش قابل مشاهده در تصویر زیر تولید میشوند. همانطور که در بالا به آن اشاره کردیم، طول داده خروجی حاصل از تابع SHA-1 برابر 160 بیت و کوتاهتر از نتیجه SHA-256 است.
در نظر داشته باشید سه حرف SHA ابتدای نام دو تابع Hashing مورد بحث در بالا مخفف Secure Hash Algorithms (الگوریتمهای هش امن) است. این به مجموعهای از توابع هش رمزنگاری اشاره دارد که الگوریتمهای SHA-0 و SHA-1 را همراه با گروههای SHA-2 و SHA-3 شامل میشوند. SHA-256 و SHA-512 بخشی از گروه SHA-2 هستند. در حال حاضر، فقط گروههای SHA-2 و SHA-3 ایمن تلقی میشوند.
اهمیت هشینگ و هش در ارز دیجیتال چیست؟
توابع هش معمولی موارد استفاده زیاد و گوناگونی دارند. به عنوان مثال باید به جستجو در پایگاههای داده، تجزیه و تحلیل فایلهای بزرگ و مدیریت داده اشاره کرد. در طرفی دیگر با تابعهای هش رمزنگاری رو به رو هستیم که به طور گسترده در اپلیکیشنهای امنیت اطلاعات نظیر احراز هویت پیام و انگشت نگاری دیجیتال مورد استفاده قرار میگیرند.
در بیت کوین به عنوان نماینده صنعت کریپتوکارنسی، کاربرد توابع هش رمزنگاری بیشتر مربوط به فرآیند ماینینگ یا همان استخراج است. این تابعها همچنین نقشی بسیار مهم در ایجاد آدرسها و کلیدهای جدید دارند. بد نیست بدانید در رمز ارزها، به جای نام کاربری و رمز عبور، با کلید عمومی و کلید خصوصی سر و کار داریم.
قدرت واقعی هشینگ در هنگام برخورد با حجم عظیمی از اطلاعات نمایان میشود. به عنوان نمونه، کاربر میتواند یک تابع هش را روی یک فایل بزرگ یا مجموعه داده اجرا کرده و سپس از خروجی برای تایید سریع صحت و تمامیت (درستی) آن بهره ببرد. این کار به لطف طبیعت و ماهیت قطعی توابع هش امکانپذیر میشود؛ یک ورودی مشخص، همیشه به صورت ساده به یک خروجی مشخص منجر میشود. اگر در یک مرتبه اجرای الگوریتم هشینگ روی فایل یا مجموعه دیتا، یک هش متفاوت ایجاد شد، متوجه بهم ریختن یکپارچگی آن خواهید شد. یک تکنیک این چنینی نیاز به ذخیرهسازی و به یادسپاری دیتای با حجم بالا را از بین میبرد.
هشینگ به خصوص در تکنولوژی بلاک چین بسیار کاربردی است. بیت کوین را در نظر بگیرید. برخی عملیاتهای بلاک چین این رمز ارز درگیر Hashing هستند. بیشتر این عملیاتها به فرآیند ماینینگ مربوط میشوند. در حقیقت، تقریبا پروتکل تمامی رمز ارزها برای لینک کردن و متراکم کردن گروههای تراکنشها داخل بلاکها و همچنین ایجاد پلهای ارتباطی رمزنگاری شده بین این بلاکها، متکی به هشینگ هستند. اتصال زنجیروار بلاکها به یکدیگر، بلاک چین (Block + Chain) را به وجود میآورد که نوع خاصی از پایگاه داده با ساختاری خاص است.
توابع هش رمزنگاری
یک تابع هش که از تکنیکهای رمزنگاری استفاده میکند، «تابع هش رمزنگاری» خطاب میشود. به طور کلی، شکستن یک فانکشن هش رمزنگاری نیازمند تلاش فوقالعادهای است. یک فرد به منظور معکوس کردن یک تابع کریپتوگرافی و رسیدن به ورودی از روی خروجی، میبایست اقدام به آزمون و خطا روی بیشمار دیتای ورودی تصادفی کند. وقتی یک ورودی، همان خروجی که در دست داریم را تولید کرد، به جواب رسیدهایم. به ظاهر کار سادهای در پیش داریم، اما این کار، حتی در قویترین کامپیوترها، ممکن است به صدها سال زمان نیاز داشته باشد!
از طرفی دیگر، باید احتمال تولید شدن خروجیهای یکسان از روی ورودیهای متفاوت را نیز در نظر گرفت. اگرچه یک تابع هشینگ خوب عاری از چنین مشکلی است، اما احتمال بروز این حادثه را نمیتوان نادیده گرفت.
یک تابع هشینگ رمزنگاری برای ایمن خطاب شدن باید دارای سه ویژگی باشد. قبل از تشریح هر یک از این سه ویژگی، تعریفی کوتاه از آنها ارائه میکنیم.
- مقاومت در برابر تصادم: هرگز نباید دو داده ورودی متفاوت، خروجی یکسانی داشته باشند.
- مقاومت در برابر پیش تصویر: هرگز نباید بتوان هش را معکوس کرد و از خروجی به ورودی رسید.
- مقاومت در برابر پیش تصویر دوم: هرگز نباید بتوان یک ورودی ثانویه پیدا کرد که با یک ورودی مشخص، هش یکسانی داشته باشد.
مقاومت در برابر تصادم
تصادم زمانی رخ میدهد که یک یا چند داده ورودی متفاوت، هش دقیقا یکسانی داشته باشند. یک تابع هش تا زمان پیدا شدن یک مثال نقض (زمانی که یک کاربر حداقل دو ورودی با خروجی یکسان پیدا کند) مقاوم در برابر تصادم در نظر گرفته میشود. فراموش نکنید هیچ فانکشن هشینگ مصون از احتمال تصادم وجود ندارد، چرا که ورودیهای ممکن بینهایت و خروجیهای احتمالی محدود هستند. به عبارت دیگر، همیشه ممکن است دو تکه دیتا هش یکسانی داشته باشند، اما احتمال برخورد به آنها در یک سیستم استفادهکننده از یک تابع Hashing مشخص، اغلب بسیار پایین است.
موضوع را طور دیگری تفسیر میکنیم. وقتی احتمال یافتن تصادم (دو ورودی با هش یکسان) به اندازهای پایین است که به میلیونها سال محاسبه نیاز دارد، تابع هشینگ مقاوم در برابر تصادم خطاب میشود. پس، اگرچه نمیتوان هیچ الگوریتم و فانکشن Hashing را صد درصد مصون از تولید هش یکسان برای دو ورودی متفاوت معرفی کرد، اما احتمال بروز چنین حادثهای در برخی از آنها به اندازهای پایین است که در برابر تصادم مقاوم تصور میشوند. به عنوان نمونه میتوان به SHA-256 اشاره کرد. این تابع در بلاک چین بیت کوین کاربرد زیادی دارد.
در میان الگوریتمهای SHA، گروههای SHA-0 و SHA-1 دیگر ایمن به شمار نمیروند، چرا که تصادمهایی توسط کاربران در آنها مشاهده شده است. در حال حاضر گروههای SHA-2 و SHA-3 در برابر تصادم ایمن قلمداد میشوند.
مقاومت در برابر پیش تصویر
این ویژگی مربوط به توابع یک طرفه است، فانکشنهایی که در آنها هرگز نباید بتوان از روی هش، دیتای اولیه و ورودی را مشخص کرد. یک تابع، مقاوم در برابر پیش تصویر خطاب میشود اگر احتمال یافتن یک ورودی که یک خروجی خاص را ایجاد کرده است، بسیار پایین باشد.
در نظر داشته باشید دستیابی به این ویژگی از مورد قبلی دشوارتر است، چرا که یک هکر، با مشاهده یک خروجی معین، برای حدس ورودی تلاش میکند. این در حالی است که یک تصادم وقتی کاربری دو داده با هش یکسان پیدا کرد، رخ میدهد. اما در اینجا مهم نیست که از کدام ورودیها استفاده شده است. در تصادم اغلب کاربران به صورت اتفاقی به وجود مشکل پی میبرند، اما در قضیه معکوس کردن هش، یک هکر بیوقفه در پی رسیدن به داده اولیه است.
ویژگی مقاومت در برابر پیش تصویر برای محافظت از دیتا بسیار ارزشمند است، چرا که یک هش ساده از یک پیام میتواند بدون نیاز به افشای اطلاعات، صحت آن را ثابت کند. در عمل، سرویسدهندگان و وب اپلیکیشنهای متعددی هشهای تولید شده از پسوردهای حسابهای کاربری متعلق به سیستم خود را نگهداری و استفاده میکنند. ذخیرهسازی رمزهای عبور به صورت متن ساده بسیار خطرناک است.
مقاومت در برابر پیش تصویر دوم
شاید بتوان این مورد را بین دو ویژگی قبلی قرار داد. یک حمله پیش تصویر دوم زمانی رخ میدهد که فردی بتواند یک ورودی دارای هش یکسان با یک ورودی از قبل در دسترس، پیدا کند. به عبارت دیگر، حمله پیش تصور دوم شامل یافتن یک تصادم است، اما در اینجا به جای جستجو برای پیدا کردن دو ورودی تصادفی که هش یکسانی تولید میکنند، یک ورودی را پیدا میکنیم که هش آن، مساوی با یک ورودی از قبل شناخته شده و استفاده شده در سیستم است.
هر تابع هش مقاوم در برابر تصادم، در برابر حمله پیش تصویر دوم نیز مقاوم محسوب میشود، چرا که ویژگی سوم مبتنی بر یافتن یک تصادم (اما به شیوهای دیگر) است. با این حال، همچنان یک هکر میتواند روی سیستمی مقاوم در برابر تصادم، حمله پیش تصویر (ویژگی دوم) را پیاده کند؛ رسیدن به داده اولیه از روی داده نتیجهی هشینگ مبحث متفاوتی است.
مبحث اثر انگشت دیجیتال در هشینگ
در بحث «درستی پیام» (Message Integrity)، موضوع اثر انگشت دیجیتال از اهمیت زیادی برخوردار است. اگر دو چیز هش یکسانی داشته باشند، میتوان از یکسان بودن آنها تقریبا مطمئن شد. به این ترتیب میتوان برای بررسی سریع اعمال یا عدم اعمال تغییر، از هشینگ بهره برد.
تصور کنید یک سیاستمدار تصمیم گرفته یک بیانیه سیاسی را برای عموم مردم منتشر کند. او پیام را تایید میکند، اما همچنان میخواهد از عدم دستکاری محتوای آن در مسیر رسیدن به روزنامه اطمینان حاصل کند. به عبارتی خواسته سیاستمدار مورد بحث، پرینت شدن عین متن او بدون ذرهای تغییر است.
برای اطمینان از یکپارچگی، درستی و تمامیت متن، سیاستمدار بعد از نوشتن متن آن را هش و سپس نتیجه را برای سردبیر ارسال میکند. سردبیر پیامی که از پیک دریافت کرده است را داخل همان تابع Hashing به کار رفته توسط مرد سیاسی، قرار میدهد. اگر نتیجه با آن چه درخواستکننده پیشتر ارسال کرده بود یکسان شود، از صحت متن و عدم دستکاری آن اطمینان حاصل خواهد شد. روش سختتر، مقایسه کلمه به کلمه متن دریافت شده از سیاستمدار و متن دریافت شده از پیک بود، اما هشینگ کار را راحتتر کرده است.
در موقعیتها و شرایط متعدد، هشینگ به منظور تایید درستی پیام کاربرد دارد. بلاک چین را در نظر بگیرید. این یک نوع پایگاه داده دارای ساختاری متفاوت بوده و اپلیکیشنها و رمز ارزهای متعددی روی آن ساخته شدهاند. میتوان این نوع دیتابیس را برای عملکرد به شیوههای دلخواه تنظیم کرد، اما اساسا مهمترین قابلیت بلاکچین ذخیرهسازی و ردیابی اطلاعات بر بستر یک شبکه است. یک سیستم بلاک چینی که به خوبی پیکربندی شده، شدیدا در برابر تقلب و دستکاری داده مقاوم است، به همین دلیل برای هر سیستمی که نیاز به حسابرسی دقیق دارد، Blockchain فوقالعاده است.
در زمان قرار دادن رکوردها (داده) داخل پایگاه داده بلاک چینی، آنها در گروههایی به نام بلاک دستهبندی میشوند. اطلاعات داخل هر بلاک به منظور تخصیص یک اثر انگشت منحصربهفرد به آن، هش میشود. نام اولین گروه دیتا را بلاک A قرار میدهیم. هش مربوط به بلاک A همچنین به گروه دیتا بعدی (بلاک B) اضافه میشود. قرار است برای بلاک B نیز یک هش ایجاد شود. از این موضوع میتوان دریافت هش B به هش A وابسته است، چرا که خروجی هشینگ بلوک A به عنوان بخشی از محتویات بلوک B مورد استفاده قرار گرفت.
اکنون اگر بخواهید بخشی از دیتای داخل بلاک A را حذف کرده یا تغییر بدهید، سبب ایجاد تغییر در هش آن خواهید شد. همانطور که در بالا مشاهده کردید، کوچکترین دستکاری داده اولیه سبب حاصل شدن یک خروجی کاملا متفاوت از انتهای تابع هشینگ خواهد شد. اکنون باید Hash بلاک B را نیز تغییر بدهید، چرا که Hash (تغییر یافته) بلاک A بخشی از محتوای بلاک B بود.
دلیل استفاده از Hash بلوک قبلی در بعدی، ایجاد ارتباط و متصل کردن آنها به یکدیگر است. بلاک چین همانطور که از نامش پیداست، زنجیره بلاک (Block + Chain) محسوب میشود، پس باید قطعههای نگهدارنده دستههای دیتا را به یکدیگر وصل نگه داشت.
تصور کنید از زمان راهاندازی سیستم تا امروز، دهها هزار بلوک داده بر اساس روندی که در بالا بررسی کردیم ایجاد شدهاند. حال اگر بخش کوچکی از محتوای یکی از آنها را تغییر بدهید، تغییر به شکل دومینو و ویروسوار تا آخرین بلاک گسترش پیدا میکند.
هشینگ برای ذخیرهسازی پسورد
از یک دیدگاه دیگر نیز میتوان معنی Hashing را در آشپزی و علوم کامپیوتر یکسان دانست! در رمز ارزها از توابع هشینگ یک طرفه استفاده میکنیم، به طوری که رسیدن از خروجی به ورودی ممکن نیست. حین آشپزی نیز نمیتوان بعد از خرد و مخلوط کردن مواد، غذای حاصل را به مواد اولیه تبدیل کرد!
از این ویژگی برگشت ناپذیری میتوان برای ذخیرهسازی پسوردها در فضای آنلاین بهره برد. تصور کنید یک حساب کاربری در یک صرافی ایجاد کردهاید. این حساب کاربری برای شما منحصربهفرد است و اطلاعات بسیار مهمی در آن نگهداری میشوند. در هر مرتبه ورود به سیستم، برای اثبات مالکیت نام کاربری ارائه شده، باید پسورد ارائه کنید، پس تعیین یک رمز عبور قوی و سپس نگهداری ایمن از آن دارای اهمیت بسیاری است.
به دلایل مختلف، رمز عبور نباید به صورت متن ساده روی سرور صرافی نگهداری شود. یکی از این دلایل، احتمال هک شدن سایر حسابهای کاربری شما است! بر اساس تحقیقی که شرکت Keeper Security انجام داد، نزدیک به 80 درصد کاربران از یک رمز عبور چند مرتبه استفاده میکنند. پس بعید نیست پسوردی که برای اکانت خود در صرافی ارز دیجیتال تعیین کردهاید، با رمز عبور حسابتان در فیس بوک، اینستاگرام، وب سایت دانشگاه و دیگر وب سایتها و پلتفرمها کاملا یکسان باشد! پس یک پلتفرم آنلاین نباید با وجود دریافت رمز عبور از کاربران با هدف احراز هویت، به کاراکترهای تشکیلدهنده آن پی ببرد.
کاربرد هشینگ در اینجا مشخص میشود. تصور کنید یک رمز عبور خطرناک نظیر “password” را برای حساب کاربریتان در صرافی تعیین کردهاید. صرافی این مقدار را وارد یک تابع هشینگ کرده و نتیجه را داخل پایگاه داده خود نگهداری خواهد کرد (تصور کنید با استفاده از تابع هش X، مقدار 5f4dcc3b5aa765d61d8327deb882cf99 حاصل شد). هر مرتبه که میخواهید به وب سایت آن لاگین کنید، با استفاده از همان تابع قبلی، مقدار وارد شده در قسمت پسورد هش شده و نتیجه، با هش ذخیره شده روی پایگاه داده مقایسه میشود. در صورت یکسان بودن دو مقدار، با موفقیت وارد سیستم خواهید شد. کوچکترین تغییر، مثلا نوشتن “Password” به جای “password”، به یک Hash کاملا متفاوت (dc647eb65e6711e155375218212b3964) منجر میشود.
به این روش، صرافی با وجود توانایی احراز هویت کاربران، هرگز اطلاعی از رمز عبور آنها ندارد. اما مشکل فقط مربوط به حدس رمز عبور سایر اکانتهای شما بر اساس پسورد صرافی نیست. ممکن است طی یک حمله سایبری، مجموعه هشهای تولید شده از رمزهای عبور کاربران پلتفرم به سرقت بروند. شاید تصور کنید به خاطر یک طرفه بودن فرآیند، هکر قادر نیست از خروجی به ورودی رسیده و به رمز عبور پی ببرد، اما سخت در اشتباه هستید! هکرها یک پایگاه داده پسورد، حاوی متداولترین رمزهای عبور نظیر “123456” و “password” (به همراه هش آنها بر اساس توابع مختلف) در اختیار دارند. پس به وسیله جستجو میتوان به پسورد رسید. به همین دلیل تاکید میکنیم از رمزهای عبور پیچیده و شامل کاراکترهای تصادفی استفاده کنید.
ترکیب سایر تکنیکها با هشینگ
برای افزایش امنیت، فقط تغییر دادن هش فانکشن و استفاده از الگوریتمهای پیچیدهتر کافی نیست. در دارک وب میتوان مخازنی بزرگ از پسوردها را به همراه Hash آنها پیدا کرد! در کیف ابزار یک هکر، فهرست هش متداولترین پسوردها جدول رنگین کمان (Rainbow Table) نام دارد.
رمز عبور “123456” که پیشتر به آن اشاره کردیم، بر اساس یک مطالعه شرکت امنیت سایبری SplashData، متداولترین در سال 2017 بود. این شرکت با بررسی دیتای عظیم فاش شده در پی حملات سایبری بزرگ مثل هک Equifax و Yahoo متوجه شد نزدیک به 3 درصد کاربران، رمز عبور “123456” را برای حسابهای کاربری خود تعیین کرده بودند!
ما انسانها به خوبی نمیتوانیم رشتههای تصادفی از کاراکترها ایجاد کنیم، به همین دلیل به منظور تعیین رمز عبور برای اکانتهای خود، به الگوها (مثل فشردن همه دکمههای ردیف اول کیبورد) یا کلمات عادی تکیه میکنیم.
برای تقویت امنیت، رمزنگارها اعمالی را برای انجام پشت پرده در زمان هشینگ پیشنهاد کردهاند. آنها مثل آشپزها میدانند نتیجه با اضافه کردن نمک به محتویات بهتر میشود! ایده آنها، استفاده از چاشنی در کنار رمزهای عبور تعیین شده توسط کاربران است. به این ترتیب از شناسایی پسوردهای متداول جلوگیری خواهد شد. به لطف این دسته راهکارها، کار برای هکرها بسیار دشوار و در برخی مواقع غیر ممکن میشود.
برای اضافه کردن نمک به رمز عبور، کافی است یک رشته تصادفی از اعداد و حروف را قبل هش کردن پسورد تعیین شده توسط کاربر، به ابتدا یا انتهای آن اضافه کنیم. تصور کنید نمک در سیستم صرافی، رشته “8£@jP” است. وقتی کاربری حین ثبت نام، رمز عبور “123456” را برای اکانت خود تعیین میکند، هشینگ روی رشته حاصل از ترکیب این دو انجام خواهد شد. ممکن است رشته اضافی برای تمام کاربران ثابت یا به ازای هر یک منحصربهفرد باشد. در صورت متفاوت بودن، باید آن را داخل پایگاه داده کنار سایر اطلاعات هر کاربر نگهداری کرد.
در رمزنگاری از اصطلاح دیگری به جای «نمک» استفاده میکنیم. در اینجا منظور از «فلفل» افزودن مقداری تصادفی به رمز عبور بعد از تعیین اولیه آن توسط کاربر است. با این حال فلفل را روی پایگاه داده ذخیره نمیکنیم. البته فلفل بینهایت مقدار نداشته و یک محدوده مشخص، مثلا 000 تا 300، برای آن در نظر گرفته میشود.
وقتی کاربر بعد از ثبت نام، رمز عبورش را به منظور ورود ارائه میکند، سیستم باید برای احتمالات مختلف (000، 001، 002، 003 الی آخر) هش تولید کند. این کار تا زمان تطابق با هش ذخیره شده در دیتابیس ادامه پیدا میکند. این کار برای پلتفرم چند میلی ثانیه بیشتر زمان نمیبرد، اما کار هکرها را بسیار دشوارتر خواهد کرد.
اگر رمز عبور شما بدون فلفل بود، هکر به ازای حدس رمز عبور، تنها یک هش درست میکرد، اما با اضافه شدن فلفل، به ازای هر پسورد به 300 هش (در این مثال) نیاز داریم. در نتیجه اگر برای هکر دستیابی به رمز عبور با وجود هشینگ به 1 روز زمان نیاز داشت، این بازه به لطف وسط آمدن پای فلفل به 300 روز افزایش پیدا میکند!
کلیدی بودن هشینگ در استخراج رمز ارزها
اعمال زیادی در فرآیند استخراج بیت کوین در گرو توابع هشینگ هستند. به عنوان نمونه میتوان به بررسی موجودی، پیوند دادن ورودی و خروجی تراکنشها و همچنین هش کردن تراکنشهای داخل یک بلاک برای تشکیل یک درخت مرکل اشاره کرد. اما یکی از اصلیترین دلایل امنیت بالای بلاک چین بیت کوین، نیاز ماینرها یا همان استخراجکنندگان شبکه به اجرای بیشمار عملیات Hashing به منظور یافتن یک راهکار معتبر برای بلاک بعدی است.
به طور ویژه، یک ماینر حین ایجاد یک مقدار هش برای بلاک کاندیدا، باید چندین مقدار را به عنوان ورودی امتحان کند. اگر نتیجه پایینتر از یک مقدار مشخص شده توسط پروتکل قرار نگیرد، قابل قبول نیست و باید عملیات هشینگ را بعد از تغییر جزئی ورودی تکرار کرد.
در اصل، ماینرها زمانی قادر به تایید بلاک خواهند بود که یک هش خروجی با تعداد مشخصی صفر در ابتدای آن تولید کنند. تعداد صفر مورد نیاز در ابتدای هش، میزان سختی فرآیند استخراج را مشخص میکند. تعداد صفرها به هش ریت (نرخ هش) شبکه بستگی دارد.
تابع SHA-256 را تصور کنید که دادهای با طول 256 بیت ایجاد میکند. 256 جایگاه برای قرار دادن 0 یا 1 وجود دارد، پس حق انتخاب زیاد است. اما وقتی باارزشترین خانه در سمت چپ را اجبارا 0 میکنیم، تعداد جایگشتهای احتمالی شدیدا کاهش پیدا میکند. به عبارتی دست تابع هشینگ برای تولید خروجی بستهتر و محدودتر میشود، به همین دلیل کار دشوار شده و باید آزمون و خطاهای بیشتری برای تولید یک هش قابل قبول توسط پروتکل انجام داد.
منظور از هش ریت که دو پاراگراف قبلتر به آن اشاره کردیم، میزان توان پردازشی و محاسباتی سرمایهگذاری شده برای استخراج بیت کوین (یا هر رمز ارز دیگر داخل شبکه اختصاصی آن) است. اگر هش ریت شبکه افزایش پیدا کند، پروتکل بیت کوین به صورت خودکار میزان دشواری استخراج را زیادتر خواهد کرد، چرا که اکنون رقابت افزایش یافته است. در نتیجه متوسط زمان ماین کردن یک بلاک کاهش پیدا نکرده و همچنان نزدیک به ده دقیقه باقی میماند.
متقابلا، وقتی هش ریت شبکه به دلایل مختلف نظیر خروج ماینرها از آن کاهش پیدا میکند، دشواری استخراج باز هم با شرایط جدید تطبیق یافته و این مرتبه کاهش پیدا میکند. با این کار از افزایش زمان ماینینگ بلاکها جلوگیری میشود.
فراموش نکنید ماینرها مجبور به یافتن تصادمها نیستند، چرا که میتوانند چندین هش به عنوان خروجی قابل قبول (شروع شده با تعدادی صفر در ابتدا) ایجاد کنند. به عبارتی دیگر، یک استخراجکننده نباید به یک هش مشخص و کاملا ثابت برای یک بلاک برسد و برآورده کردن شرط وجود تعدادی صفر در ابتدای هش کفایت میکند؛ ماینر میبایست از بین مجموعه جوابهای مورد تایید، به یکی از آنها دست پیدا کند.
با توجه به هزینهبر بودن فرآیند استخراج بیت کوین، ماینر فکر تقلب را به ذهنش راه نمیدهد. یک استخراجکننده با هدف دریافت جایزه ماین کردن بلاکهای جدید (در شبکه Bitcoin برابر 6.25 BTC به ازای هر بلاک) هزینه زیادی برای خرید یا ایجاد یک ریگ ماینینگ صرف میکند. با توجه به فشار پردازشی زیادی که روی دستگاههای استخراجکننده قرار دارد، آنها انرژی الکتریکی را میبلعند! نتیجه، نجومی شدن مبلغ قبض برق است. اگر ماینر تقلب کند، تمام تلاشش به باد رفته و با وجود صرف هزینه (کاهش عمر مفید ریگ استخراج و مصرف برق زیاد)، هیچ چیزی در عوض به دست نخواهد آورد.
مشکل تولد در هشینگ
احتمالا از ابتدای مطلب، به یک رخنه در هشینگ فکر کرده و با توضیحات قسمت «مقاومت در برابر تصادم» نیز قانع نشدهاید! اگر میتوان هر محتوای دیجیتال با هر اندازه را هش کرد، پس بیشمار خروجی احتمالی داریم.
یک تابع Hashing را در نظر بگیرید که نتیجه آن همیشه 32 کاراکتری است. خروجی میتواند هر چیزی بین 00000000000000000000000000000000 و ffffffffffffffffffffffffffffffff باشد. با در نظر گرفتن تعداد جایگاهها، 1,208,925,819,614,629,174,706,176 جایگشت (احتمال) داریم. اگرچه این رقم بسیار بسیار بزرگی است، اما همچنان محدود به شمار میرود. با در نظر گرفتن نامحدود بودن محتوا، با مشکل تکرار (یکسان شدن هش دو ورودی متفاوت) مواجه میشویم.
از این آسیبپذیری هشینگ نمیتوان چشمپوشی کرد، هر چند احتمال آن بسیار پایین باشد. همانطور که در بالا به آن اشاره کردیم، یکسان شدن خروجی چند قطعه داده بعد از هشینگ تصادم نام دارد. فرض بر غیر ممکن بودن اجرای فرآیندی برای شناسایی محتوای دارای Hash مشابه شما است. به منظور شناسایی باید انواع مختلف محتوا را برای یافتن دادهای دارای هش یکسان با ورودی مورد نظر خود، داخل تابع قرار بدهید. این عمل حمله بروت فورس (Brute Force) نام داشته و موفقیت آن در گرو زمان زیاد و قدرت محاسباتی بسیار بالا است.
ممکن است برای برخی، مشابه شدن Hash دو تکه داده کاملا متفاوت با وجود ازدیاد جایگشتها موضوع جالبی به نظر برسد، اما این اتفاق در عمل ویرانگر است. البته احتمال پیدا کردن یک تصادم مخصوصا در صورت زیاد بودن جایگشتها بسیار پایین است، اما همچنان هیچ سیستمی در برابر این مشکل مصون نبوده و احتمال (هر چند شدیدا پایین) همیشه وجود دارد.
اگر به این که کدام دو ورودی، خروجی یکسانی خواهند داشت اهمیت نمیدهید، مشکلی بروز خواهد کرد. در ریاضیات آن را «مشکل تولد» خطاب میکنیم. یک کلاس دارای 25 دانشآموز را تصور کنید. احتمال برابر بودن روز تولد یکی از آنها با روز مورد نظر شما، مثلا 16 اکتبر، تقریبا پایین (حدود 7 درصد به استثنای سالهای کبیسه برای سادگی) است. با این حال، احتمال مشابه بودن روز تولد دو نفر از دانشآموزان به مراتب بیشتر و حدود 50 درصد است. در حقیقت، برای اطمینان 99.9 درصدی از یکسان بودن روز تولد دو نفر در یک مجموعه، تنها به یک مجموعه متشکل از 70 نفر نیاز دارید!
از مشکل تولد میتوان برای تقلب در یک سیستم محافظت شده با هشینگ استفاده کرد. در این مثال، محققان دو فایل PostScript ایجاد کردند. PostScript زبانی است که ظاهر یک صفحه چاپ شده را توصیف میکند. یکی از آنها توصیهنامهای برای یک کارآموز است و دیگری، نامهای است که به این کارآموز اجازه دسترسی به پروندههای محرمانه را میدهد.
آنها حین مشاهده به وسیله یک مرورگر سند متفاوت به نظر میرسند. با این حال، یک سری موارد اضافی نیز داخل کد وجود دارند. آنها تا زمان نگاه به صورت مستقیم غیر قابل شناسایی هستند. محققان برای یافتن یک هش خروجی مشابه، با انواع مختلف کد در هر دو سند سر و کله زدند. رئیس کارآموز، توصیهنامه را با استفاده از هش آن برای تایید سند پیوست امضا میکند، اما کارآموز با یک جابهجایی و قرار دادن امضا زیر نامه دوم، تمام دسترسیهای لازم را به خود خواهد داد.
برای جلوگیری از بروز یک حمله این چنینی، باید از توابع دارای مقاومت بیشتر در برابر تصادم استفاده کرد. به عنوان نمونه SHA3–512 را در نظر بگیرید که طول خروجی تولید شده توسط آن در مقایسه با Hash الگوریتم MD5 بسیار بیشتر است. به خاطر افزایش تعداد جایگشتها، احتمال رخ دادن تصادم به شدت کاهش پیدا خواهد کرد.
سخن پایانی
توابع هش ابزارهایی ضروری در علوم کامپیوتر به شمار رفته و کاربردهای فراوانی دارند. اهمیت آنها حین کار کردن با حجم عظیمی از دیتا افزایش پیدا میکند. الگوریتمهای هشینگ در ترکیب با رمزنگاری کاربرد بیشتری پیدا کرده و به روشهای مختلف، امنیت و احراز هویت را بهبود میبخشند.
تابعهای هش رمزنگاری تقریبا در تمام شبکههای کریپتوکارنسی حیاتی بوده و در مرکز فرآیندهای اساسی آنها قرار دارند، به همین دلیل آشنایی با ویژگیهای این الگوریتمها برای هر فرد علاقهمند به فناوری بلاک چین از اهمیت زیادی برخوردار است.
تهیه شده در بیت 24