فهرست مطالب۷ بخش
  1. تابع هش چیست و چه کار می‌کند؟
  2. یک امتحان کوچک: هش کلمه «سلام»
  3. صفحه‌کلید فارسی یا عربی؟ برای هش فرق دارد
  4. خودتان امتحان کنید
  5. ویژگی‌های یک تابع هش امن
  6. هش رمزگذاری نیست
  7. SHA-256 و Keccak-256؛ دو تابع هشی که در کریپتو زیاد می‌بینید
  8. هش در بلاکچین کجا به کار می‌آید؟
  9. هش تراکنش (TXID)
  10. هش بلاک و زنجیره‌ای که دست نمی‌خورد
  11. درخت مرکل؛ همه تراکنش‌ها در یک هش
  12. پازل ماینینگ و اثبات کار
  13. شما کجا با هش سروکار دارید؟

هش (Hash) چیست؟ به زبان ساده، خروجی یک تابع ریاضی است که هر داده‌ای را، از یک کلمه تا یک فایل چند گیگابایتی، به رشته‌ای کوتاه با طول ثابت تبدیل می‌کند. این رشته حکم اثر انگشت آن داده را دارد: همان ورودی همیشه همان هش را می‌دهد، ولی کافی است یک حرف یا حتی یک فاصله عوض شود تا هش به‌کلی چیز دیگری شود. راه برگشت هم ندارد؛ از روی هش نمی‌شود فهمید ورودی چه بوده است.

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

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

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

معروف‌ترین تابع هش در کریپتو SHA-256 است. عدد ۲۵۶ در اسمش یعنی خروجی‌اش همیشه ۲۵۶ بیت است، چه ورودی یک حرف باشد چه کل شاهنامه. این ۲۵۶ بیت را معمولاً به شکل ۶۴ نویسه از رقم‌های ۰ تا ۹ و حروف a تا f می‌نویسند. SHA-256 عضو خانواده SHA-2 است. این خانواده را مؤسسه ملی استاندارد و فناوری آمریکا (NIST) در استاندارد FIPS 180-4 تعریف کرده و همان‌جا کاربردش را هم گفته است: اینکه بفهمیم پیامی بعد از ساخته شدن هشش تغییر کرده یا نه.

یک امتحان کوچک: هش کلمه «سلام»

هش SHA-256 کلمه «سلام» را حساب کردیم. متن را با کدگذاری UTF-8 به تابع دادیم؛ همان کدگذاری‌ای که تقریباً همه گوشی‌ها و سایت‌ها متن فارسی را با آن ذخیره می‌کنند. بعد فقط یک علامت تعجب به آخرش اضافه کردیم و دوباره هش گرفتیم:

  • هش «سلام»: bda1fa48345336618741fd2c4bc02809eb099c49a9b02fb5056401ab6d4dc3e6
  • هش «سلام!»: 903c0515c0763a585585cdbe653ad9217a1b330dd35239e4c5a589190eb24969

دو خروجی هیچ شباهتی به هم ندارند. در تصویر زیر، نویسه‌های عوض‌شده را زرد کرده‌ایم. سطر سوم هم هش متنی ۲۷ هزار بایتی است که باز در همان ۶۴ نویسه جا شده است.

هش SHA-256 سه ورودی: «سلام»، «سلام!» و متنی ۲۷ هزار بایتی؛ با یک علامت تعجب ۶۱ نویسه از ۶۴ نویسه عوض شده است (محاسبه ۶ آبان ۱۴۰۵)

از ۶۴ نویسه، ۶۱ تا عوض شده است. در سطح بیت هم ۱۲۴ بیت از ۲۵۶ بیت فرق کرده است، یعنی تقریباً نصف؛ درست همان چیزی که از دو عدد کاملاً تصادفی انتظار داریم. به این رفتار «اثر بهمنی» (Avalanche Effect) می‌گویند: یک تغییر کوچک در ورودی کل خروجی را زیرورو می‌کند و هیچ ردی از شباهت باقی نمی‌گذارد.

صفحه‌کلید فارسی یا عربی؟ برای هش فرق دارد

این حساسیت برای ما فارسی‌زبان‌ها مثال آشنایی دارد. «کیف پول» را یک بار با «ک» و «ی» فارسی بنویسید و یک بار با «ك» و «ي» عربی که بعضی صفحه‌کلیدها می‌گذارند. روی صفحه تقریباً یک شکل‌اند، ولی کامپیوتر آن‌ها را حروف متفاوتی می‌بیند و هششان هم هیچ ربطی به هم ندارد. اینجا فقط هشت نویسه اول هر هش را آورده‌ایم:

  • «کیف پول» با حروف فارسی: 6295c352…
  • «كيف پول» با حروف عربی: 1adecc6e…
  • «بیت‌کوین» با نیم‌فاصله: 85a5185b…
  • «بیت کوین» با فاصله معمولی: 17a110d0…

نتیجه عملی‌اش ساده است. اگر رمز عبورتان حروف فارسی دارد و یک بار آن را با یک صفحه‌کلید و بار دیگر با صفحه‌کلیدی تایپ کنید که «ی» عربی می‌گذارد، از نظر سیستم دو رمز متفاوت زده‌اید.

خودتان امتحان کنید

روی مک یا لینوکس، ترمینال را باز کنید و این را بنویسید:

Shell
printf 'سلام' | shasum -a 256

باید همان bda1fa48… را ببینید. در لینوکس دستور sha256sum هم همین کار را می‌کند. فقط یک تله کوچک هست: اگر به‌جای printf از echo استفاده کنید، echo یک «خط جدید» نامرئی به آخر کلمه می‌چسباند و هش دیگری می‌گیرید (3ea84a1b…). این هم نشان می‌دهد هش حتی به یک نویسه نامرئی حساس است.

سایت‌های «SHA-256 generator» هم همین کار را می‌کنند و برای امتحان یک کلمه اشکالی ندارند. ولی رمز عبور، عبارت بازیابی یا کلید خصوصی‌تان را هیچ‌وقت در چنین سایتی تایپ نکنید. آن سایت متن شما را پیش از هش گرفتن می‌بیند و معلوم نیست با آن چه می‌کند.

ویژگی‌های یک تابع هش امن

هر تابعی که داده را کوتاه کند به درد بلاکچین نمی‌خورد. تابعی که بیت‌کوین به آن تکیه کرده باید این پنج ویژگی را با هم داشته باشد:

  1. همیشه همان جواب: «سلام» امروز و ده سال بعد، روی گوشی شما و روی سرور یک صرافی، همان bda1fa48… را می‌دهد. برای همین هزاران نود شبکه بی‌آنکه با هم هماهنگ کنند، یک بلاک را بررسی می‌کنند و به یک نتیجه می‌رسند.
  2. طول ثابت: یک کلمه باشد یا یک فیلم دو ساعته، خروجی SHA-256 همیشه ۶۴ نویسه است.
  3. محاسبه سریع: هش گرفتن برای کامپیوتر کسری از ثانیه طول می‌کشد.
  4. یک‌طرفه بودن: از روی هش نمی‌شود ورودی را ساخت. تنها راه این است که ورودی‌ها را یکی‌یکی حدس بزنید و هششان را مقایسه کنید.
  5. مقاومت در برابر برخورد: نباید بشود دو ورودی متفاوت پیدا کرد که هش یکسانی بدهند. به چنین جفتی «برخورد» (Collision) می‌گویند.

ویژگی آخر کمی توضیح می‌خواهد. از نظر ریاضی برخورد حتماً وجود دارد، چون ورودی‌های ممکن بی‌نهایت‌اند ولی SHA-256 «فقط» ۲ به توان ۲۵۶ خروجی مختلف دارد؛ عددی ۷۸ رقمی. حرف سر این است که پیدا کردن چنین جفتی باید عملاً غیرممکن باشد. اگر کسی بتواند دو ورودی با هش یکسان بسازد، می‌تواند یک سند یا تراکنش جعلی را به‌جای سند اصلی جا بزند.

این نگرانی خیالی نیست. SHA-1، نسل قبلی همین خانواده، از ۱۹۹۵ میلادی در استانداردهای آمریکا بود. NIST در ۲۴ آذر ۱۴۰۱ اعلام کرد کامپیوترهای امروزی می‌توانند برای SHA-1 پیام جعلی با هش یکسان بسازند و این حمله‌ها در سال‌های اخیر SHA-1 را بی‌اعتبار کرده‌اند. این مؤسسه گفت تا آخر سال ۲۰۳۰ استفاده از SHA-1 را در پروتکل‌هایی که هنوز به آن تکیه دارند کنار می‌گذارد. توصیه‌اش هم این بود که همه به خانواده‌های SHA-2 یا SHA-3 کوچ کنند. پس الگوریتم‌های هش هم پیر می‌شوند و امنیتشان را باید با گذشت زمان دوباره سنجید.

هش رمزگذاری نیست

خیلی‌ها هش را با رمزگذاری (Encryption) یکی می‌گیرند. رمزگذاری دوطرفه است: متن را قفل می‌کنید و کسی که کلید درست را دارد، متن اصلی را پس می‌گیرد. هش نه کلید دارد، نه راه برگشت. به تعبیر خود NIST در همان خبر، ساختن دوباره پیام اصلی از روی هش ممکن نیست.

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

SHA-256 و Keccak-256؛ دو تابع هشی که در کریپتو زیاد می‌بینید

بیت‌کوین برای کارهای اصلی‌اش از SHA-256 استفاده می‌کند، آن هم دو بار پشت سر هم: اول هش داده را می‌گیرد و بعد هش همان هش را. مستندات توسعه‌دهندگان بیت‌کوین این را به شکل SHA256(SHA256()) می‌نویسند. هش بلاک، ریشه درخت مرکل و شناسه تراکنش همه با همین هش دوتایی ساخته می‌شوند.

اتریوم سراغ تابع دیگری رفته است. واژه‌نامه ethereum.org تابع هش اتریوم را Keccak-256 (کچک) معرفی می‌کند. Keccak برنده مسابقه‌ای بود که NIST برای انتخاب نسل بعدی استاندارد هش برگزار کرد. استاندارد SHA-3 در مرداد ۱۳۹۴ هم بر پایه همین الگوریتم منتشر شد. ولی نسخه استاندارد SHA3-256 با Keccak-256 اتریوم دقیقاً یکی نیست و برای یک ورودی دو جواب متفاوت می‌دهد. هش «سلام» را با هر دو گرفتیم:

  • با SHA3-256: a063bdc8…
  • با Keccak-256 اتریوم: 869d430f…

اگر برنامه‌نویس هستید حواستان باشد: کتابخانه‌ای که فقط SHA3-256 دارد، هشی می‌دهد که با هش‌های اتریوم جور درنمی‌آید.

رد Keccak را هر روز در آدرس کیف پول می‌بینید، شاید بی‌آنکه بدانید. طبق همان واژه‌نامه، آدرس یک حساب اتریوم ۱۶۰ بیت آخر هش Keccak کلید عمومی است و یک 0x هم جلویش می‌گذارند. آدرس‌های ترون، همان شبکه‌ای که تتر (USDT) را با استاندارد TRC20 روی آن جابه‌جا می‌کنند، هم به همین روش از کلید عمومی ساخته می‌شوند و فقط شکل نوشتنشان فرق دارد. چون هش یک‌طرفه است، حتی کسی که آدرس شما را دارد نمی‌تواند از رویش به کلید خصوصی برسد.

هش در بلاکچین کجا به کار می‌آید؟

هش تراکنش (TXID)

هر تراکنش بیت‌کوین شناسه‌ای دارد که هش دوتایی SHA-256 داده‌های همان تراکنش است. اگر حتی یک ساتوشی از مبلغ یا یک نویسه از آدرس مقصد عوض شود، شناسه هم به‌کلی عوض می‌شود. در اتریوم و شبکه‌های مشابهش هم شناسه تراکنش یک هش ۶۴ نویسه‌ای است که با 0x شروع می‌شود. در مطلب TXID چیست گفته‌ایم این شناسه را کجا پیدا کنید و در اکسپلورر بلاکچین چطور بخوانید.

هش بلاک و زنجیره‌ای که دست نمی‌خورد

هر بلاک بیت‌کوین یک «هدر» (Header) ۸۰ بایتی دارد و هش بلاک همان هش این هدر است. هش بلاک قبلی هم داخل همین هدر نوشته می‌شود. به گفته مستندات بیت‌کوین، به همین خاطر هیچ بلاک قبلی را نمی‌شود عوض کرد، مگر اینکه هدر بلاک بعدی هم عوض شود.

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

درخت مرکل؛ همه تراکنش‌ها در یک هش

بلاک بیت‌کوین گاهی هزاران تراکنش دارد، ولی در هدر ۸۰ بایتی فقط جای یک هش برای همه آن‌هاست. این هش را با «درخت مرکل» (Merkle Tree) می‌سازند. در تصویر زیر مسیری را دنبال کنید که از «تراکنش ۳» تا بالای درخت زرد شده است.

نمودار نمونه درخت مرکل با چهار تراکنش؛ با تغییر تراکنش ۳، هش‌های مسیر آن تا ریشه مرکل عوض می‌شوند (۶ آبان ۱۴۰۵)

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

مزیت دیگرش این است که برای ثابت کردن اینکه تراکنشی در بلاک هست، لازم نیست همه تراکنش‌ها را داشته باشید؛ هش‌های کنار مسیر آن تراکنش تا ریشه کافی است. برای بلاکی با ۵۴۸ تراکنش، این یعنی فقط ۱۰ هش. همین ایده بیرون از خود بلاکچین هم به کار رفته است: صرافی کراکن در گزارش اثبات ذخایرش موجودی مشتری‌ها را به شکل ناشناس در یک درخت مرکل می‌گذارد.

پازل ماینینگ و اثبات کار

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

هش بلاک ۹۷۳٬۵۹۲ بیت‌کوین کنار عدد هدف؛ هر دو با ۱۹ صفر شروع می‌شوند و هش کوچک‌تر است (داده mempool.space، ۶ آبان ۱۴۰۵)

این بلاک ۹۷۳٬۵۹۲ است که ۶ آبان ۱۴۰۵ ساعت ۲۳:۰۶ به وقت تهران ساخته شد و ۵۴۸ تراکنش داشت. هدر ۸۰ بایتی‌اش را از mempool.space برداشتیم، خودمان دو بار پشت سر هم از آن SHA-256 گرفتیم و دقیقاً همان هشی درآمد که سایت نشان می‌داد. هش و هدف هر دو با ۱۹ صفر شروع می‌شوند، ولی رقم بعدی در هش «۱» است و در هدف «۲». پس هش کوچک‌تر بوده و بلاک قبول شده است.

در آن لحظه، احتمال اینکه یک حدس تصادفی چنین هشی بدهد حدود یک در ۶۰۰ هزار میلیارد میلیارد بود و کل شبکه بیت‌کوین به‌طور میانگین در هر ده دقیقه همین‌قدر حدس می‌زند. به تعداد این حدس‌ها در ثانیه هش‌ریت می‌گویند و کسانی که این حدس‌ها را می‌زنند همان ماینرها هستند. اسم این روش «اثبات کار» (Proof of Work) است، چون هر بلاک معتبر نشان می‌دهد سازنده‌اش واقعاً برق و دستگاه خرج کرده است.

شما کجا با هش سروکار دارید؟

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

کجا می‌بینیدش

چه شکلی است

به چه کارتان می‌آید

رسید برداشت از کیف پول یا صرافی

TXID، یک رشته ۶۴ نویسه‌ای (در شبکه‌های اتریومی با 0x)

پیگیری تراکنش در اکسپلورر و فرستادن آن برای پشتیبانی

صفحه یک بلاک در اکسپلورر

هشی که با چندین صفر شروع می‌شود

اینکه تراکنشتان در کدام بلاک ثبت شده و چند تأیید گرفته

آدرس کیف پول اتریوم یا ترون

ساخته‌شده از هش کلید عمومی

می‌توانید آدرس را با خیال راحت به دیگران بدهید

صفحه دانلود نرم‌افزار کیف پول

رشته SHA-256 کنار فایل یا فایلی به اسم SHA256SUMS

مطمئن شدن از اینکه فایل دانلودشده دستکاری نشده

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

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

پرسش‌های رایج

هش با هش‌ریت چه فرقی دارد؟

هش خروجی یک بار اجرای تابع هش است، مثل همان رشته ۶۴ نویسه‌ای که از «سلام» گرفتیم. هش‌ریت تعداد هش‌هایی است که یک دستگاه یا کل شبکه در هر ثانیه حساب می‌کند و معیار قدرت ماینینگ است.

چرا هش‌ها فقط عدد و حروف a تا f دارند؟

چون هش را در مبنای شانزده (هگزادسیمال) می‌نویسند که شانزده رقم دارد: ۰ تا ۹ و a تا f. هر نویسه ۴ بیت را نشان می‌دهد، پس ۲۵۶ بیت SHA-256 می‌شود ۶۴ نویسه.

هش با امضای دیجیتال چه فرقی دارد؟

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

اگر کسی TXID تراکنش من را داشته باشد، خطری دارد؟

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

ممکن است SHA-256 روزی شکسته شود؟

هیچ‌کس نمی‌تواند برای همیشه تضمین بدهد؛ سرگذشت SHA-1 نشان داد الگوریتم‌ها پیر می‌شوند. فعلاً NIST خانواده SHA-2 (که SHA-256 هم جزو آن است) و SHA-3 را جایگزین امن SHA-1 می‌داند.