ساختار تابع هش و کاربرد آن – جلسه هفتم (+ویدئو)

2 1,654

ساختار تابع درهم ساز (هش)

توابع درهم‌­ساز (هش)، مهم­ترین گام برای درک نحوه کار بلاکچین‌ ها هستند.

در این درس می­‌خواهیم به طور خاص در مورد یک نوع از توابع هش، تحت عنوان «تابع هش رمزنگاری» صحبت کنیم.

ابتدا بیایید مفهوم تابع را بیان کنیم. اگر شما با نرم افزارهای صفحه گسترده مثل Microsoft Excel کار کرده باشید با مفهوم تابع آشنا هستید. مثلاً تابع Sum را در نظر بگیرید. این تابع، مقادیری را به عنوان لیست ورودی گرفته و حاصل جمع آنها را به خروجی می‌­فرستد.

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

همچنین، خروجی آن شبیه به یک رشته طولانی از کاراکترهای تصادفی است که به آن چکیده (Digest) هم گفته می­‌شود ولی ما در اینجا به آن هش خواهیم گفت.

 

کاربرد تابع هش چیست؟

سوالی که اکنون مطرح می­‌شود این است که کاربرد هش چیست؟

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

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

 

در این صورت اگر یک مهاجم (Attacker)، فایل گذرواژه­‌ها را داشته باشد، در واقع گذرواژه همه کاربران را به منظور ورود به سیستم در اختیار خواهد داشت!

 

کار مناسبی که در این هنگام می­‌توان انجام داد استفاده از تابع هش است. به جای ذخیره کردن گذرواژه­‌ها، ابتدا هش آنها محاسبه شده و سپس مقادیر هش آنها ذخیره می­‌شود.

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

ممکن است برایتان این سوال پیش آید که آیا امکان بازیابی گذرواژه شما از روی هش آن وجود دارد یا خیر. خوشبختانه پاسخ این سوال، خیر است.

دقیقاً مثل این است که بدانید جمع دو عدد ۱۲ شده است ولی ندانید که آن دو عدد ۵ و ۷ بوده و یا ۴ و ۸ بوده‌­اند!

توابع هش رمزنگاری شده، مفاهیم ریاضی پیچیده­‌ای دارند.

 

ویژگی برگشت‌ناپذیر بودن توابع هش به چه معنا است؟

یکی از ویژگی­‌های مهم این توابع که آن­ها را مفید ساخته است ویژگی «برگشت ­ناپذیر بودن» آنهاست.

اگر هکرها موفق به دریافت یک فایل حاوی گذرواژه شوند تنها راهی که ممکن است توسط آن بتوانند کلمه عبور شما را حدس بزنند استفاده از حمله دیکشنری (Dictionary Attack) است. در این نوع حمله، هکرها سعی می­‌کنند کلمات و عبارات متداول را هش کرده و بررسی کنند که آیا تطابق ایجاد می­‌شود یا خیر.

مثلا اگر رمز عبور شما کلمه “dog” باشد خیلی سریع می‌توانند آن را بدست بیاورند.

به همین دلیل است که در روز ایجاد اکانت از شما خواسته می­‌شود گذرواژه‌تان شامل حروف کوچک و بزرگ و اعداد و نمادها باشد.

مثلا گذرواژه “dOg22%” خیلی بعید است که توسط هکرها حدس زده شود بنابراین گذرواژه شما امن خواهد بود.

فرض کنید گذرواژه شما “۱۲۳۴” و گذرواژه من “۱۲۳۵” باشد. در این صورت با وجود تنها یک کاراکتر متمایز، هش آنها کاملا متفاوت خواهد بود. تابع هش، نه تنها برگشت­‌ناپذیر است بلکه ورودی‌­های خیلی مشابه هم در این تابع منجر به ایجاد خروجی­‌های کاملا متفاوتی خواهند شد. این یکی دیگر از ویژگی­‌های تابع هش است!

می­‌توان چنین تصور کرد که هش به عنوان یک امضای منحصر به فرد برای یک داده ورودی خاص می‌­باشد.

یکی دیگر از خواص تابع هش این است که احتمال وقوع هش یکسان برای دو ورودی متفاوت (پدیده برخورد یا collision) خیلی بعید است.

همچنین این توابع بسیار سریع محاسبه شده و به توان رایانشی چندانی توسط رایانه نیاز ندارند.

بیایید مثال دیگری بزنیم.

فرض کنید شما یک سند قانونی ایجاد کرده و آن را برای بازبینی ارسال نموده‌­اید. فرض کنید به شما پیامی برسد مبنی بر اینکه سند بدون هیچ تغییری به تصویب رسید.

چگونه می‌توانید مطمئن شوید که سند هیچ تغییری نکرده است؟

یک راه این است که سند را خط به خط خوانده و با سند اصلی مطابقت دهید.

راه دیگر این است که هش هر دو سند را محاسبه کرده و با هم مقایسه کنید.

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

تاثیر طول تابع هش بر احتمال برخورد (Collision)

توابع هش رمزنگاری نام‌های متفاوتی دارند و نام‌­های آنها اغلب با طول خروجی آنها رابطه دارد.

تابع هش SHA-128 به معنای «الگوریتم هش استاندارد» است. این کلمه مخفف عبارت Standard Hashing Algorithm بوده و دارای طول خروجی ۱۲۸ بیت است.

SHA-256 دارای طول خروجی ۲۵۶ بیت است.

بیت‌ها رشته­‌هایی از ۰ و ۱ هستند که هر چیز دیجیتالی را ایجاد می­‌کنند. هرچقدر تعداد بیت‌ها بیشتر باشد امنیت نیز بیشتر می‌شود. در این صورت احتمال برخورد کاهش می‌یابد.

اگر فرض کنیم یک تابع هش دارای خروجی دو بیتی باشد واضح است که این هش، عددی بین ۰ تا ۴ خواهد بود. در این حالت یافتن دو ورودی با خروجی یکسان کار ساده‌­ای است. بعد از دادن چهار ورودی مختلف، قطعاً شاهد یک برخورد خواهیم بود.

اما برای یک تابع هش ۱۲۸ بیتی، صدو بیست و هشت خروجی متفاوت خواهید داشت. بنابراین احتمال وقوع برخورد بسیار اندک است.

 

ویژگی قطعی (Deterministic) بودن توابع هش به چه معنا است؟

ویژگی مهم دیگر توابع هش، قطعی بودن خروجی آنهاست.

بنابراین برای یک تابع هش مثل SHA-256، دو ورودی یکسان منجر به تولید خروجی یکسانی خواهند شد.

نکته مهم دیگر این است که خروجی تابع هش یک عدد است. شاید شما در آن حروف هم مشاهده کنید اما باید توجه داشته باشید که این اعداد از نوع هگزادسیمال (اعدادی در مبنای ۱۶) هستند.

اعداد معمولی که ما استفاده می­‌کنیم در مبنای ۱۰ هستند. یعنی بعد از شمارش ۸ و ۹ ، به ۱۰ و ۱۱ و… می­‌رسیم. به عبارت دیگر، در هر ستون عددی، ده نماد ۰ و ۱ و … ۹ به کار می‌رود. با توجه به توضیحات داده شده در اعداد هگزادسیمال هر ستون عددی دارای شانزده نماد ۰, ۱, …۹, A, B, C, D, E, F  می‌­باشد.

پس هر وقت چنین چیزی را دیدید بدانید یک عدد هگزادسیمال است که قابلیت جمع و تفریق و مقایسه با سایر اعداد را نیز دارد.

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

در ادامه با نحوه استفاده از هش در بلوک­‌ها آشنا خواهیم شد.

در بلاکچین از تابع هش رمزنگاری به منظور ایجاد رکوردهای متشکل از داده‌های ثبت شده در یک بلاکچین استفاده می‌شود تا هر تغییر اندکی در داده­‌ها نیز به راحتی شناسایی شود.

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

 

توابع هش استفاده شده در بلاکچین­‌های بیت­کوین و اتریوم چه هستند؟

تابع هش استفاده شده در بلاکچین بیت کوین، SHA-256 (Secure Hashing Algorithm) با طول خروجی ۲۵۶ بیت است.

در بلاکچین اتریوم از تابع هش Ethash استفاده شده است. خروجی این تابع به فرم زیر است:

۰xb846300e188829d1b819389b31cef3b9cfaf335082ee66f830a875f1c1beb396

هش فوق مربوط به بلاک ۵۰۰۰۱۷۱ است که در تاریخ Jan-30-2018  و ساعت ۰۲:۲۰:۲۸ PM +UTC از بلاکچین اتریوم استخراج شده است. (برای کسب اطلاعات بیشتر در مورد این بلاک می‌توانید به Etherscan مراجعه کنید)

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

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

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

 

چرا بلاکچین علاوه بر توابع هش از توابع رمزنگاری نیز استفاده می­‌کند؟

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

توابع هش و رمزنگاری کلید عمومی نقش مهمی در پیاده­‌سازی مکانیزم توافق (Consensus) دارند. مکانیزم توافق کمک می­‌کند که مشارکت­‌کنندگان در بستر (Platform) بلاکچین نظر واحدی در مورد اتقاقات داشته باشند و بین آنها اختلاف نظری پیش نیاید. مکانیزم توافق بیت­‌کوین و اتریوم، «اثبات انجام کار» نامیده می­‌شود. استخراج­‌کنندگان (ماینرها) تضمین می‌کنند که تراکنش‌­های ثبت شده در دفترحساب، همگی درست باشد. این ویژگی، از حملات و ورود اطلاعات غلط به سیستم جلوگیری نموده و اعتبار آن را تضمین می­‌کند. اگر اکنون مکانیزم توافق «اثبات انجام کار» را درک نکردید، نگران نباشید. در خلال دروس بعدی، در مورد آنها بیشتر توضیح خواهیم داد. در درس بعدی، شما مطالب بیشتری در خصوص رمزنگاری و امضا با کلید عمومی را فرا خواهید گرفت.

 

ممکن است شما دوست داشته باشید
2 نظرات
  1. ابراهیمی می گوید

    سلام وعرض ادب
    سپاس ویژه از بابت محتوای خوب و مفیدتون، ممنون میشم لینک ویدیویی این صفحه رو اصلاح بکنین که ویدیوی آموزشی قابل پخش باشه

    1. دپارتمان آموزش می گوید

      سپاس از توجه شما
      انجام شد

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.