تابع هش یا هشینگ چیست؟
حفاظت از امنیت دادههای حساس و بررسی صحت آنها همیشه اهمیت بسزایی داشته است و با ایجاد فناوریهای جدیدتر و رشد تکنولوژی، روز به روز اهمیت آن افزایش پیدا کرده است. دادهای که حفاظت از آن دارای اهمیت باشد، رمزنگاری میشود تا عموم مردم، امکان دسترسی به محتوا آن را نداشته باشند. استفاده از توابع هش، یکی پرکاربردترین روشها برای حفاظت از امنیت داده و بررسی صحت آنها است اما آیا میدانید تابع هش چیست؟ در این مقاله به صورت کامل با آن آشنا خواهیم شد. (اگر به مباحث رمزنگاری و انواع روشهای آن علاقه دارید، پیشنهاد میکنم مقاله “رمزنگاری چیست؟” از سایت بیتفا را حتماً مطالعه کنید)
آشنایی با توابع هش
توابع هش یا هشینگ، توابع ریاضی هستند که هر داده دلخواه را به عنوان ورودی دریافت میکنند و آن را به یک خروجی هش شده (برای درک بهتر میتوانید خروجی هش شده را به عنوان یک خروجی رمزنگاری شده فرض کنید) با طول ثابت تبدیل میکنند؛ به خروجی این توابع “مقدار هش” گفته میشود. توابع هش، خروجیها را با تعداد کارکتر ثابت ایجاد میکنند و معمولاً خروجی تولید شده، عبارت کوتاهتری نسبت به عبارت ورودی است؛ به همین دلیل به توابع هش، توابع فشرده سازی نیست گفته میشود. در ادامه این مقاله به ویژگیهای مهم توابع هش خواهیم پرداخت و با پرکاربردترین توابع هش، آشنا خواهیم شد.
ورودی و خروجی در توابع هش
مقدار ورودی در توابع هش، میتواند هر دادهای از جمله یک کلمه کوتاه، یک متن چند جملهای و یا حتی یک فایل تصویری و هر چیز دیگری باشد، اما در مقابل مقدار خروجی یا همان مقدار هش، دارای یک ساختار مشخص با تعداد کارکتر ثابت است و هر میزان ورودی را با توجه به همان ساختار مشخص خود، هش میکند.
ولی تعدادی ویژگی وجود دارد که یک تابع هش استاندارد، حتماً باید آنها را رعایت کرده باشد.
ویژگیهای مهم در توابع هش
یک تابع هش استاندارد باید داری سه ویژگی مهم باشد تا صلاحیت و امنیت آن تضمین شود. در ادامه به هر کدام از آنها خواهیم پرداخت.
تابع هش یک خیابان یکطرفه است
توابع هش، باید به صورت یکطرفه باشند؛ وقتی دادهای در تابع هش قرار میگیرد و یک مقدار هش یا خروجی ایجاد میکند، دیگر برگشت آن فرایند (بازگرداندن خروجی به ورودی) نباید امکان پذیر باشد. یعنی این امکان وجود ندارد تا با استفاده از مقدار هش (خروجی)، به داده اولیه دسترسی پیدا کرد. فرایند این تابع باید به صورت فقط یکطرفه صورت گیرد.
مقدار هش (خروجی) منحصر به فرد است
در یک تابع هش ایدهآل، هر خروجی به صورت منحصر به فرد است، یعنی اگر خروجی یا همان مقدار هش یک داده ورودی، برای مثال برابر (A) باشد، هیچ داده ورودی دیگری نباید وجود داشته باشد که مقدار هش آن برابر (A) باشد. البته این موضوع در شرایط ایدهآل است و از آن جایی که مقدار هش در یک تابع، بر اساس یک ساختار مشخص و تعداد کارکتر ثابت ایجاد میشود، برای یک تابع بسیار دشوار است که تمام مقادیر هش را منحصر به فرد ایجاد کند؛ اما احتمال یکی بودن مقادیر هش در دو ورودی مختلف، باید خیلی پایین باشد.
نکته مهمی که وجود دارد این است که در حالی که امکان دارد دو ورودی مختلف یک خروجی ثابت را ایجاد کنند، اما شناسایی این دو ورودی باید دشوار باشد در غیر این صورت احتمال ایجاد حملات در این تابع هش، افزایش پیدا خواهد کرد.
تابع هش باید همهگیر باشد
نکته آخری که وجود دارد آن است که یک تابع هش کاربردی، باید توانایی هش کردن هر دادهای را با بالاترین سرعت داشته باشد تا بتوان از آن تابع در هر شرایطی استفاده کرد.
کاربردهای توابع هش
توابع هش در فناوریهای مختلفی استفاده میشوند ولی به صورت کلی توابع هش دو کاربرد مهم دارند.
کاربرد اول، ذخیره کلمه عبور است
در این فرایند کمله عبور را در تابع هش قرار میدهند و خروجی آن که مقدار هش کلمه عبور است را به جای خود کلمه عبور ذخیره میکنند و پردازش بنا بر اساس همین مقدار هش صورت میگیرد. در این شرایط حتی اگر مهاجم به مقدار هش کلمه عبور نیز دسترسی پیدا کند، به دلیل یکطرفه بودن توابع، امکان دسترسی به خود کلمه عبور را ندارد و در نتیجه احتمال ایجاد اختلال کاهش مییابد.
کاربرد دوم، بررسی صحت داده است
از آن جایی که خروجی هر تابع منحصر به فرد است و با هر تغییر کوچکی در محتوای داده ورودی، مقدار هش (خروجی) نیز تغییر میکند، میتوان از این ویژگی در جهت بررسی صحت دادهها استفاده کرد. در این فرایند یک داده را در تابع هش قرار میدهند و مقدار هش (خروجی) آن را ذخیره میکنند. در نتیجه اگر بعداً محتوا داده دستکاری شود و تغییر کند، داده جدید دیگر با مقدار هش قبلی سازگار نخواهد بود و در نتیجه با این کار از ایجاد تغییرات و دستکاری دادهها جلوگیری میشود و امکان بررسی صحت داده فراهم میشود.
کاربرد توابع هش در بلاکهای بلاکچین
بلاکچین زنجیرهای از بلاکها است که این بلاکها با ترتیب و پشت سر هم ایجاد میشوند (نحوه ایجاد بلاکها و نحوه کار بلاکچینها را در مقاله “نحوه کارکرد فناوری بلاکچین” کامل بررسی کردهایم و پبشنهاد میکنم حتماً مطالعه کنید). هر بلاک، دارای یک کد هش منحصر به فرد است و درواقع این کد، هویت آن بلاک را مشخص میکند. هر بلاکی که ایجاد میشود دارای سه دسته داده است. این سه دسته از دادهها در هر بلاک عبارتند از کد هش بلاک قبلی آن بلاک، محتوا و داده تراکنشهایی که در آن بلاک ذخیره میشوند و کد نانس. هر بلاک که ایجاد میشود، این سه دسته داده را (این دادهها در هر بلاک به صورت منحصر به فرد هستند) در تابع هش قرار میدهد و مقدار هش جدیدی را ایجاد میکند. این مقدار هش، کد هش یا همان هویت آن بلاک را شکل میدهد.
این کار باعث جلوگیری از ایجاد تغییرات و دستکاری دادهها در تمام بلاکها میشود و در نتیجه دادههای یک بلاکچین را کاملاً امن و غیر قابل تغییر میسازد. اگر هر دستکاری یا تغییری در دادهها و یا تراکنشهای یک بلاک ایجاد شود، باعث میشود تا کد هش (هویت آن بلاک) نیز تغییر کند. و از آنجایی که هر بلاک کد هش بلاک قبلی خود را ذخیره میکند، اگر تغییراتی در دادههای یک بلاک ایجاد شود و هش آن تغییر کند، دیگر بلاک بعدی هویت آن بلاک را تایید نمیکند. با این کار از تغییر یافتن دادههای ذخیره شده در بلاکچین جلوگیری میشود.
اما آیا تمام بلاکچینها از یک تابع هش ثابت استفاده میکنند؟ پرکاربردترین توابع هش کدامند و هر بلاکچین از چه تابع هشی استفاده میکند؟
پرکاربردترین توابع هش کدامند؟
در طول تاریخ توابع هش زیادی ایجاد شدهاند که در زمان خود کاربرد فراوانی داشتند ولی پس از یک بازه زمانی کاربرد خود را از دست دادهاند و جایگاه خود را به توابع پیشرفتهتری دادهاند. همانطور که تکنولوژی و فناوری همواره در حال رشد هستند، روشهای رمزنگاری و توابع هش هم باید همواره رشد کنند، در غیر این صورت امکان دارد این توابع با توجه به پیشرفت تکنولوژی، رمزگشایی شوند و فاقد ارزش شوند.
در ادامه با تعدادی از توابع هش آشنا خواهیم شد.
توابع هش خانواده MD – (Message Digest)
خانواده توابع هش MD، شامل ۴ تابع ۱۲۸ بیتی است که عبارتند از MD2 , MD4 , MD5 , MD6 که معروفترین آنها MD5 نام دارد. این تابع در سال ۱۹۹۱ طراحی شد و سپس کاربرد گستردهای را پیدا کرد. این تابع هش را میتوان به عنوان اولین تابع هش دانست که کاربرد گستردهای داشته است.
اما این تابع هش، امروزه کاربرد گسترده خود را از دست داده است و در حالی که همچنان کاربرد دارد اما دیگر امروزه استفاده از این نوع تابع هش توصیه نمیشود و امنیت چندانی ندارد، به همین دلیل این نوع تابع هش در پروژههای بلاکچینی معتبر کاربردی نداشته است.
خانواده توابع هش SHA
توابع هش secure hashing algorithm (الگوریتم هشینگ امن) معروف به توابع SHA کاربرد زیادی در پروژههای بلاکچینی دارند. این دسته از توابع هش از ۴ نسل که عبارتند از نسلهای SHA-0 , SHA-1 , SHA-2 , SHA-3 تشکیل شده است.
نسل اول یعنی نسل SHA-0 در سال ۱۹۹۳ طراحی شد اما این نسل از توابع SHA خیلی موفقیت آمیز نبود و در نهایت پس از مدتی فعالیت به دلیل نقص فنی با نسل جدید خود یعنی SHA-1 جایگزین شد. نسل دوم، یا همان SHA-1 نیز پس از مدتی فعالیت، بخش عمدهای از کاربرد خود را از دست داد و میتوان این نسل را نیز شکست خورده دانست. اما در نهایت نسل SHA-1 نیز با نسل SHA-2 جایگزین شد که در حال حاضر این نسل کاربرد فراوانی در پروژههای بلاکچینی دارد و در بلاکچین بیت کوین نیز مورد استفاده قرار گرفته است.
اما توابع هش نیز مانند دیگر فناوریها باید همواره در طول زمان رشد کنند و خود را از خطرات احتمالی دور نگه دارند. به همین دلیل، در حالی که برای نسل سوم توابع خانواده SHA، یعنی SHA-2 تا به حال هیچ مشکل فنی پیش نیامده است، اما سازمان NIST نسل جدیدی از توابع این خانواده را به نام SHA-3 با استفاده از استانداردهای Keccak-256 طراحی کرد.
بلاکچینها از کدام توابع هش استفاده میکنند؟
بلاکچین بیت کوین که اولین و معروفترین بلاکچین است، از تابع هش SHA-256 استفاده میکند که این نوع تابع از توابع نسل ۳ از خانواده SHA یعنی نسل SHA-2 به حساب میآید. علاوه بر بلاکچین بیت کوین، تمامی فورکهای آن از جمله بیت کوین کش نیز از این تابع استفاده میکنند. از دیگر بلاکچینهایی که از تابع هش SHA-256 استفاده میکنند میتوان به بلاکچین Zcash اشاره کرد.
اما در مقابل بلاکچین اتریوم از تابع هش Keccak-256 استفاده میکند که این تابع بر پایه توابع نسل ۴ خانواده SHA یعنی SHA-3 به حساب میآید. بلاکچینهای لایت کوین و دوج کوین نیز از تابع هش Scrypt استفاده میکنند.
جمعبندی
امروزه توابع هش، کاربرد گستردهای پیدا کردهاند و بیشترین کاربرد آنها در مباحث حفظ امنیت داده و بررسی صحت آنها دیده میشود. توابع هش به صورت یکطرفه فعالیت میکنند و یک ورودی که میتواند هر نوع دادهای باشد را به یک خروجی با ساختار ثابت تبدیل میکند. توابع هش در پروژههای بلاکچینی نیز کاربرد فراوانی دارند و درواقع یکی از اصلیترین ارکان پروژههای بلاکچینی به حساب میآیند.