ایران چارت بلاک چین تابع هش و فرایند هشینگ

تابع هش و فرایند هشینگ

تخمین زمان مطالعه

۱۲ دقیقه
یکشنبه 26 اردیبهشت 1400
تابع هش و فرایند هشینگ

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

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


هشینگ به چه معناست؟

«هشینگ» (Hashing) فرایندی است که ورودی‌های دلخواه را به خروجی‌هایی با اندازه‌ی ثابت تبدیل می‌کند. الگویتمی که این کار را انجام می‌دهد «تابع هش» (Hash Function) نام دارد. درست است که تابع هش کاربرد زیادی در دنیای رمزنگاری دارد اما باید بدانیم که تمام توابع هش مخصوص رمزنگاری نیستند. یکی از توابع هش معروف، «تابع هش رمزنگاری» (Cryptographic Hash Function) نام دارد که از آن در طراحی و پیاده‌سازی پروژه‌های دنیای ارزهای دیجیتال استفاده‌ی زیادی می‌شود. در قسمت‌های بعدی این مقاله بیشتر در مورد این تابع صحبت می‌کنیم. بلاک چین‌ها و سایر سیستم‌های توزیع‌شده توانسته‌اند به کمک قابلیت‌های این توابع، یکپارچگی و امنیت اطلاعات را تا سطح قابل‌توجهی افزایش دهند.

تمام انواع توابع هش عملکردی قطعی و ثابت دارند. یعنی تا زمانی که ورودی یکسانی به آن‌ها داده شود، خروجی هش یا همان «مقدار هش» (Hash value) تغییری نخواهد کرد. ارزهای رمزنگاری‌شده از نوعی تابع هش یک‌طرفه استفاده می‌کنند؛ به این معنی که الگوریتم مورد استفاده آن‌ها را نمی‌توان به‌راحتی معکوس کرد. به بیان ساده‌تر، تولید یک خروجی هش از ورودی کار آسانی است اما برعکس این کار بسیار دشوار است و نمی‌توان به‌راحتی از خروجی هش به مقدار اولیه رسید. به طور کلی هرچه پیدا کردن مقدار اولیه از خروجی هش کار سخت‌تری باشد،‌ امنیت الگوریتم هش بیشتر خواهد بود.

هشینگ چیست


تابع هش چگونه کار می ‌کند؟

ورودی‌های تابع هش می‌توانند هر اندازه‌ی دلخواهی داشته باشند اما خروجی‌های این تابع همواره یک اندازه‌ی ثابت خواهند داشت. برای مثال الگوریتم هش SHA-256‌ همیشه و به ازای تمام ورودی‌ها، خروجی‌های ۲۵۶ بیتی تولید می‌کند، در حالی که الگوریتم SHA-1‌ همیشه خروجی‌های ۱۶۰ بیتی تولید می‌کند.

برای درک بهتر این موضوع، با یک مثال واقعی بحث را ادامه می‌دهیم. می‌خواهیم یک ورودی دلخواه مثل کلمه‌ی بایننس را به‌صورت انگلیسی، یک بار به‌صورت Binance و یک بار binance به تابع هش SHA-256‌ بدهیم و ببینیم چه خروجی‌هایی تولید می‌شود. از این تابع در شبکه‌ی بیت کوین نیز استفاده شده است.


خروجی ۲۵۶ بیتی    ورودی SHA-256
f1624fcc63b615ac0e95daf9ab78434ec2e8ffe402144dc631b055f711225191Binance
59bba357145ca539dcd1ac957abc1ec5833319ddcae7f5e8b5da0c36624784b2binance


همان‌طور که مشاهده می‌کنید، فقط اولین حرف ورودی‌ها در کلمه‌ی بایننس با هم متفاوت نوشته شده ‌است. یعنی یک بار با حروف بزرگ انگلیسی و یک بار با حروف کوچک به تابع هش داده شده، ولی دو خروجی کاملاً متفاوت به دست آمده ‌است. خروجی‌های این تابع به ازای تمام ورودی‌ها، همواره ۲۵۶ بیت (یا ۶۴ کاراکتر) خواهد بود و تا زمانی که ورودی تغییر نکند، خروجی تغییر نخواهد کرد. حالا اگر همین مثال را در مورد تابع هش SHA-1 تکرار کنیم، به نتایج زیر می‌رسیم.


خروجی ۱۶۰ بیتیورودی SHA-1
7f0dc9146570c608ac9d6e0d11f8d409a1ee6ed1Binance
e58605c14a76ff98679322cca0eae7b3c4e08936binance


اینجا هم می‌بینیم که با تغییر تنها یک حرف در ورودی تابع، خروجی کاملاً متفاوتی تولید شده و اندازه‌ی هر دو خروجی مقدار ثابت ۱۶۰ بیت است. جالب است بدانیم که عبارت SHA‌ کوتاه‌شده‌ی سه کلمه Secure Hash Algorithms‌ به معنی «الگوریتم‌های هش ایمن» است و شامل مجموعه‌ای از توابع هش با الگوریتم‌های متفاوت می‌شود. از جمله توابع هش می‌توان SHA-0، SHA-1، SHA-2، SHA-256 و SHA-512‌ را نام برد.

تابع هش


اهمیت فرایند هشینگ

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

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

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

بیشتر بدانید: بلاک چین چیست


تابع هش رمزنگاری

تا اینجا متوجه شدیم که تابع هشی که از الگوریتم‌های رمزنگاری برای ساخت خروجی استفاده کند، تابع هش رمزنگاری نامیده می‌شود. به‌طورکلی تشخیص الگوریتم هش رمزنگاری و شکستن کد آن، کار بسیار سختی بوده و نیاز به توان پردازشی قابل توجهی دارد. در حقیقت اگر شخصی بخواهد فرایند تابع هش رمزنگاری را معکوس کند و از مقدار هش، ورودی تابع را به دست آورد، باید آن‌قدر ورودی‌های مختلف را به صورت آزمون و خطا به تابع بدهد تا اینکه یکی از ورودی‌ها، همان خروجی موجود را تولید کند. البته در این بین مفهومی به نام «تصادم» (Collision) وجود دارد و طبق آن، ممکن است برای دو ورودی متفاوت، خروجی یکسانی تولید شود.

به‌طور کلی وجود سه شرط برای امن بودن عملکرد تابع هش رمزنگاری ضروری است. این سه شرط عبارتند از:

  • Collision resistance: نباید برای دو ورودی مختلف، یک خروجی یکسان تولید شود.
  • Preimage resistance: نباید بتوان الگوریتم تابع را معکوس کرد و از خروجی موجود، ورودی اولیه را پیدا کرد.
  • Second-Preimage resistance: نباید بتوان ورودی دیگری را یافت که خروجی مشابهی با یک ورودی دیگر داشته باشد.

اگر درک این سه مفهوم کمی دشوار به نظر می‌رسد، در ادامه با ما همراه باشید تا در مورد آن‌ها بیشتر صحبت کنیم.

هشینگ چیست


Collision 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 به تابع مقاوم در برابر تصادم وجود دارد و شاید حمله‌کننده بتواند از روی خروجی، ورودی اولیه را پیدا کند.


استخراج ارز دیجیتال

فرایند استخراج یک ارز دیجیتال مثل بیت کوین در مراحل مختلفی از تابع هش استفاده می‌کند. مثلاً چک کردن موجودی آدرس‌ها، ارتباط ورودی و خروجی تراکنش‌ها و یا هش ‌کردن تراکنش‌های یک بلاک برای ساخت «درخت مرکل» (Merkle Tree) با استفاده از تابع هش انجام می‌شود. یکی از مهم‌ترین دلایلی که موجب امنیت بالای بلاک چین بیت کوین شده ‌است، این است که ماینرها باید توان پردازشی قابل توجهی صرف کنند تا بتوانند راه حل ریاضی مورد قبول برای ساخت بلاک جدید را پیدا کنند.

اتفاقی که در استخراج بیت کوین می‌افتد از این قرار است که ماینر ورودی‌های بسیار زیادی را هش میکند و نتیجه را با هش بلاک جدید مقایسه می‌کند. ماینر تنها زمانی موفق می‌شود بلاک قابل قبول را پیدا کند که هش تولید شده توسط او، کمتر از مقدار هدف باشد و این یعنی مقدار هش باید با تعداد مشخصی صفر شروع شده ‌باشد. به این تعداد صفر، «سختی شبکه» (Network difficulty) گفته می‌شود. سختی شبکه بر اساس «قدرت پردازش» یا هش ریت (Hash rate) کل شبکه مشخص می‌شود.

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

نکته قابل توجه دیگر این است که ماینرها مجبور به پیدا کردن تصادم نیستند؛ زیرا چندین مقدار هش قابل قبول برای هر بلاک وجود دارد، یعنی مقادیری که با تعداد مشخصی صفر در ابتدای آن‌ها شروع می‌شوند و ماینرها فقط باید در کوتاه‌ترین زمان ممکن، یکی از پاسخ‌های قابل قبول را پیدا کنند. شبکه طوری طراحی شده است که اولین کسی که در هر ۱۰ دقیقه بتواند هش قابل قبول را پیدا کند، اجازه‌ی تأیید و اضافه کردن بلاک جدید را به بلاک چین خواهد داشت و پاداش مورد نظر به او تعلق می‌گیرد.

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


سخن پایانی

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

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

تگ ها:

درباره نویسنده

قاسم میلاجردی

مهندسی نرم‌افزار خوندم و عاشق مسائل فنی دنیای کامپیوترهام. بیت کوین همون سالی متولد شد که من وارد دانشگاه شدم و حتی یه مقاله هم راجع‌بهش خوندم. اون موقع‌ها قیمتش ۱۰ دلار بود! دیگه نمیشه به گذشته برگشت و ارزدیجیتال خرید ولی میشه توی این زمینه مطالعه کرد و آینده بهتری رو ساخت؛ به همین خاطر تولید محتوای تخصصی کریپتوها رو به عنوان شغل اصلی انتخاب کردم و ازین بابت واقعا خوشحالم.

نظر شما

نظرات کاربران