رمز ۱۰۷مرحلهٔ پایه، درس ۷ از ۲۲ بلاکچین و فناوری
هش (Hash) در بلاکچین یعنی چه؛ اثر انگشت دادهها
هش چیست و چرا به آن اثر انگشت داده میگویند؟ ویژگیهای تابع هش، تفاوت SHA-256 و Keccak-256 و نقش هش در زنجیر کردن بلوکها را به زبان ساده بخوانید.
هش (Hash) خروجی یک تابع ریاضی است که هر دادهای را، از یک کلمه تا یک فایل بزرگ، به رشتهای کوتاه با طول ثابت تبدیل میکند؛ رشتهای که مثل اثر انگشت، نمایندهٔ همان داده است. طبق تعریف مؤسسهٔ ملی استاندارد و فناوری آمریکا (NIST)، تابع هش رمزنگاری ورودی با طول دلخواه را به خروجی با طول ثابت نگاشت میکند و باید دو ویژگی داشته باشد: یکطرفه بودن و مقاومبودن در برابر برخورد [۱]. در بلاکچین همین دو ویژگی باعث میشود بلوکها به هم قفل شوند و هر دستکاری در گذشته فوراً آشکار شود.
هش به زبان ساده؛ اثر انگشت یکطرفه
در درس بلاکچین چیست به زبان ساده فقط اشاره شد که هر بلوک یک هش دارد. این درس، که بخشی از مسیر آموزشی بلاکچین و فناوری است، یک قدم جلوتر میرود و توضیح میدهد هش دقیقاً چیست و چرا تقریباً همهٔ سازوکارهای امنیتی بلاکچین روی آن بنا شدهاند.
اثر انگشت را در نظر بگیرید. اثر انگشت شما کوچک است، برای هر آدمی فرق میکند و با دیدن آن میتوان فهمید با چه کسی سروکار داریم. اما هیچکس نمیتواند از روی یک اثر انگشت، چهره، قد یا صدای صاحبش را بازسازی کند. هش دقیقاً همین نقش را برای دادهها دارد: شناسهای کوتاه که داده را معرفی میکند، ولی خود داده را لو نمیدهد.
استاندارد هش امن مؤسسهٔ NIST هم هدف این الگوریتمها را ساختن «نمایش فشردهای» از داده توصیف میکند [۲]. کلمهٔ «فشرده» اینجا مهم است، ولی نباید آن را با فشردهسازی فایل اشتباه گرفت. فایل فشرده را میتوان دوباره باز کرد؛ هش را نه.
یک مثال مفهومی کمک میکند. فرض کنید کلمهٔ «سلام» را به یک تابع هش بدهید. خروجی، رشتهای طولانی و بهظاهر بیمعنا از حروف و ارقام است. حالا اگر همان کلمه را با یک علامت تعجب، یعنی «سلام!»، به تابع بدهید، خروجی بهکلی عوض میشود و هیچ شباهتی به خروجی قبلی ندارد. اگر هم یک کتاب کامل را به همان تابع بدهید، طول خروجی دقیقاً به اندازهٔ خروجی همان یک کلمه است.
هش، تابع هش، چکیدهٔ پیام
واژهٔ «هش» گاهی به خود تابع و گاهی به خروجی آن گفته میشود. در متنهای استاندارد، به خروجی «چکیدهٔ پیام» (Message Digest) هم میگویند. در این درس هر جا «هش یک داده» آمده، منظور خروجی تابع است.
ویژگیهایی که یک تابع هش رمزنگاری را امن میکند
هر تابعی که داده را کوتاه کند، تابع هش رمزنگاری به حساب نمیآید. توابعی که در بلاکچین به کار میروند باید چند ویژگی مشخص داشته باشند. دو ویژگی اول در تعریف رسمی NIST آمدهاند و بقیه لازمهٔ کاربرد عملی آنها هستند.
۱. یکطرفه بودن
از روی خروجی نمیتوان به ورودی رسید. طبق تعریف NIST، بازسازی ورودی از روی خروجی باید عملاً غیرممکن باشد [۱]. «عملاً» یعنی نه از نظر منطقی محال، بلکه آنقدر پرهزینه و طولانی که با توان محاسباتی شناختهشده امکانپذیر نیست.
۲. مقاومت در برابر برخورد
به حالتی که دو ورودی متفاوت هش یکسان داشته باشند، «برخورد» (Collision) میگویند. چون تعداد ورودیهای ممکن بینهایت است و طول خروجی ثابت، برخورد از نظر ریاضی وجود دارد؛ اما در یک تابع هش امن، پیدا کردن آن باید عملاً غیرممکن باشد [۱]. اگر کسی بتواند دو داده با هش یکسان بسازد، میتواند یکی را جای دیگری جا بزند و اثر انگشت دیگر قابل اعتماد نیست.
۳. نتیجهٔ تکرارپذیر
یک ورودی مشخص، با یک تابع مشخص، همیشه همان خروجی را میدهد. اگر اینطور نبود، هیچ رایانهای نمیتوانست هش دیگری را بررسی و تأیید کند.
۴. اثر بهمنی
کوچکترین تغییر در ورودی، مثل همان علامت تعجب، خروجی را کاملاً دگرگون میکند. این ویژگی باعث میشود نتوان با تغییرهای جزئی و مقایسهٔ خروجیها، کمکم به ورودی نزدیک شد.
۵. طول ثابت خروجی
اندازهٔ ورودی هر چه باشد، خروجی همیشه یک اندازه دارد. برای نمونه، خروجی SHA-256 همیشه ۲۵۶ بیت است [۲].
تعریف رسمی
واژهنامهٔ امنیت رایانهای NIST تابع هش رمزنگاری را تابعی میداند که ورودی با طول دلخواه را به خروجی با طول ثابت نگاشت میکند و هم یکطرفه است و هم در برابر برخورد مقاوم [۱]. این یک تعریف فنی پایدار است، نه خبری که با گذشت زمان کهنه شود.
SHA-256 و Keccak-256؛ دو تابع پرکاربرد
تابعهای هش زیادی وجود دارند، اما در دنیای رمزارز دو نام بیش از بقیه شنیده میشوند.
SHA-256
SHA-256 یکی از الگوریتمهایی است که در استاندارد FIPS ۱۸۰-۴ مؤسسهٔ NIST تعریف شده است. طبق همین استاندارد، خروجی آن همیشه ۲۵۶ بیت است، ورودیاش باید کمتر از ۲ به توان ۶۴ بیت باشد و داده در بلوکهای ۵۱۲ بیتی پردازش میشود [۲]. سقف ورودی آنقدر بزرگ است که در عمل هر فایل یا تراکنشی را در بر میگیرد. بیتکوین برای ساختن هش بلوکها از SHA-256 استفاده میکند؛ این نکته به طراحی بیتکوین برمیگردد و در متن استاندارد NIST نیامده است.
Keccak-256
اتریوم تابع دیگری به کار میبرد. در مخزن رسمی اتریوم در گیتهاب، تابع هش این شبکه Keccak-256 معرفی شده و تأکید شده است که این تابع گاهی بهاشتباه sha256 یا sha3 نامیده میشود [۳]. نتیجه ساده است: تابع هش اتریوم همان SHA-256 نیست که بیتکوین به کار میبرد و اگر یک دادهٔ یکسان را به این دو تابع بدهید، دو خروجی کاملاً متفاوت میگیرید.
چرا این تفاوت برای یک مبتدی مهم است؟
لازم نیست جزئیات ریاضی این توابع را بدانید. همینقدر کافی است بدانید که هر شبکه قواعد هش خودش را دارد و خروجیها قابل جابهجایی نیستند. اگر در متنی دیدید که «اتریوم از SHA-256 استفاده میکند»، دقت آن متن را با احتیاط بسنجید.
هش چطور بلوکها را به هم زنجیر میکند
مهمترین کاربرد هش در بلاکچین، همان چیزی است که به این فناوری نامش را داده: زنجیر شدن بلوکها. طبق مستندات توسعهدهندگان بیتکوین، سربرگ هر بلوک در قالب ۸۰ بایتی ذخیره میشود و یکی از فیلدهای آن «هش سربرگ بلوک قبلی» است [۴].
این یک فیلد کوچک، اثر بزرگی دارد. هر بلوک هش بلوک قبل از خودش را در دل دارد؛ پس بلوکها مثل حلقههای یک زنجیر به هم وصل میشوند. حالا فرض کنید کسی بخواهد یک تراکنش قدیمی را تغییر دهد:
- با تغییر تراکنش، محتوای بلوک حاوی آن عوض میشود و هش آن بلوک هم بهکلی تغییر میکند (اثر بهمنی).
- بلوک بعدی هنوز هش قدیمی را در سربرگ خود نگه داشته است؛ پس دو حلقه دیگر با هم جور نیستند.
- برای پنهانکردن این ناهمخوانی، باید سربرگ بلوک بعدی را هم عوض کرد، که هش آن را تغییر میدهد، و همینطور تا آخرین بلوک.
به تعبیر مستندات بیتکوین، نمیتوان تراکنشی را تغییر داد، مگر اینکه بلوک حاوی آن و همهٔ بلوکهای بعدی هم تغییر کنند [۴].
-
بلوک ۱
بلوک آغاز (جنسیس)
نخستین تراکنشها
اشاره به بلوک قبلی: ندارد
-
بلوک ۲
چند تراکنش
اثر انگشت (هش) بلوک ۱
-
بلوک ۳
چند تراکنش
اثر انگشت (هش) بلوک ۲
-
بلوک ۴
تازهترین
تراکنشهای تازه
اثر انگشت (هش) بلوک ۳
زنجیر شدن با هش، بهتنهایی جلوی دستکاری را نمیگیرد؛ کاری که میکند این است که دستکاری را آشکار و بسیار پرهزینه میکند. بخش دیگر ماجرا این است که نسخههای دفتر کل در دست تعداد زیادی رایانهٔ مستقل است و هر کدام میتوانند هشها را بررسی کنند. دربارهٔ این بخش در درس شبکهٔ غیرمتمرکز چیست و چرا اهمیت دارد بیشتر بخوانید.
هش در استخراج و آدرس کیف پول
هش فقط برای زنجیر کردن بلوکها نیست. دو جای دیگر هم هست که یک مبتدی زیاد با آن روبهرو میشود.
استخراج و اثبات کار
طبق مستندات توسعهدهندگان بیتکوین، سربرگ بلوک در الگوریتم اثبات کار هش میشود [۴]. به زبان ساده، در استخراج شبکه شرطی برای هش سربرگ تعیین میکند و استخراجکننده باید سربرگی بسازد که هش آن این شرط را برآورده کند. چون خروجی هش از قبل قابل پیشبینی نیست (اثر بهمنی)، هیچ میانبری وجود ندارد: استخراجکننده یکی از فیلدهای سربرگ را تغییر میدهد، دوباره هش میگیرد و این کار را بارها تکرار میکند تا به جواب برسد.
نکتهٔ جالب، نامتقارن بودن این کار است. پیدا کردن جواب به حدسهای بسیار زیادی نیاز دارد، اما بررسی درستی آن برای بقیهٔ شبکه فقط یک بار هشگرفتن است. همین نامتقارنی باعث میشود بازنویسی بلوکهای قدیمی، که در بخش قبل دیدیم، نهفقط آشکار بلکه بسیار پرهزینه باشد.
آدرس کیف پول و شناسهٔ تراکنش
در بسیاری از شبکهها، آدرس کیف پول با چند مرحله هشگرفتن از کلید عمومی ساخته میشود. جزئیات این مراحل از شبکهای به شبکهٔ دیگر فرق میکند، اما منطق کلی یکی است: آدرس از کلید ساخته میشود، ولی از روی آدرس نمیتوان به کلید رسید. به همین ترتیب، هر تراکنش هم معمولاً با هش خودش شناخته میشود؛ رشتهای که در کاوشگرهای بلاکچین با آن میتوان وضعیت تراکنش را دنبال کرد. برای آشنایی با ساختار کلی کیف پول، درس کیف پول ارز دیجیتال چیست را ببینید.
هیچ ابزاری هش را به کلید یا عبارت بازیابی برنمیگرداند
بعضی سایتها و حسابهای شبکههای اجتماعی ادعا میکنند با «رمزگشایی هش» یا «بازیابی از روی آدرس» میتوانند کیف پول گمشده را برگردانند و برای این کار عبارت بازیابی یا کلید خصوصی شما را میخواهند. هش یکطرفه است و چنین ابزاری وجود ندارد. هر کس کلید خصوصی یا عبارت بازیابی (Seed Phrase) شما را بخواهد، میتواند کل دارایی کیف پول را منتقل کند. این اطلاعات را در هیچ فرم یا گفتوگویی وارد نکنید.
هش چه کاری نمیکند؛ رمزگذاری نیست
بسیاری از سوءبرداشتها دربارهٔ هش از اینجا میآید که آن را با رمزگذاری یکی میدانند. شناختن مرزهای هش به همان اندازهٔ شناختن تواناییهایش مهم است.
هش رمزگذاری نیست
رمزگذاری دوطرفه است: داده با یک کلید قفل میشود و کسی که کلید درست را دارد، میتواند آن را دوباره به شکل اول برگرداند. هش کلیدی ندارد و راه برگشتی هم ندارد. هدف رمزگذاری محرمانه نگهداشتن داده است؛ هدف هش ساختن اثر انگشتی برای بررسی سالمبودن داده.
یکطرفه بودن یعنی محرمانه بودن نیست
اگر ورودی کوتاه یا قابل حدس باشد، مثل یک رمز عبور ساده یا یک عدد کوچک، مهاجم لازم نیست هش را «برگرداند». کافی است حدسهای ممکن را یکییکی هش کند و با هش موجود مقایسه کند. پس هش از دادهای که بهراحتی قابل حدس است، محافظت چندانی نمیکند.
هش درستی محتوا را ثابت نمیکند
هش فقط نشان میدهد داده از لحظهٔ هشگرفتن تغییر کرده است یا نه. اگر اطلاعات نادرستی ثبت شده باشد، هش آن هم با دقت، همان اطلاعات نادرست را نمایندگی میکند. ثبت روی بلاکچین به یک ادعا اعتبار نمیدهد؛ فقط تغییر پنهانی آن را دشوار میکند.
هش بهتنهایی شبکه را امن نمیکند
امنیت یک بلاکچین حاصل ترکیب هش، سازوکار اجماع و پراکندگی نسخههای دفتر کل است. تابع هش یک قطعهٔ اصلی این پازل است، نه همهٔ آن. هش هم هیچ ارتباطی با ارزش یا قیمت یک رمزارز ندارد؛ فنیبودن یک پروژه یا نامبردن از الگوریتم هش آن، دلیلی برای اعتماد مالی به آن نیست.
جمعبندی؛ آنچه از این درس باید بدانید
مرور درس هش
- هش خروجی کوتاه و با طول ثابتی است که مثل اثر انگشت، نمایندهٔ یک داده است.
- تابع هش رمزنگاری یکطرفه است و در برابر برخورد مقاوم؛ این دو ویژگی در تعریف رسمی NIST آمدهاند.
- کوچکترین تغییر در ورودی، خروجی را کاملاً عوض میکند.
- بیتکوین از SHA-256 و اتریوم از Keccak-256 استفاده میکند و این دو یکی نیستند.
- هر بلوک هش بلوک قبلی را نگه میدارد؛ برای همین تغییر گذشته یعنی تغییر همهٔ بلوکهای بعدی.
- هش رمزگذاری نیست و هیچ ابزاری از روی هش یا آدرس، کلید خصوصی یا عبارت بازیابی را پیدا نمیکند.
اگر این درس را خواندهاید، اکنون میتوانید دوباره به بخش سازوکار فنی در درس بلاکچین برگردید؛ جملههایی مثل «هر بلوک به بلوک قبلی اشاره میکند» حالا معنای دقیقتری برای شما دارند.
خودتان را بسنجید
هش با رمزگذاری چه فرقی دارد؟
رمزگذاری دوطرفه است؛ داده با یک کلید قفل میشود و صاحب کلید میتواند آن را دوباره باز کند. هش یکطرفه است و کلیدی ندارد؛ هدفش پنهانکردن و بازکردن داده نیست، بلکه ساختن اثر انگشتی است که نشان دهد داده دست نخورده است.
میشود از روی هش، دادهٔ اصلی را پیدا کرد؟
در یک تابع هش رمزنگاری استاندارد، بازسازی ورودی از روی خروجی عملاً غیرممکن تعریف شده است. تنها راه، حدسزدن ورودی و مقایسهٔ هش آن است؛ برای همین اگر ورودی کوتاه یا قابل حدس باشد، مثل یک رمز عبور ساده، هش آن هم در برابر حدسزدن آسیبپذیر است.
چرا یک تغییر کوچک، هش را کاملاً عوض میکند؟
توابع هش رمزنگاری طوری طراحی شدهاند که هر بیت ورودی روی کل خروجی اثر بگذارد. در نتیجه حتی اضافهشدن یک ویرگول، خروجی را به رشتهای بهکلی متفاوت تبدیل میکند و از روی شباهت خروجیها نمیتوان به شباهت ورودیها پی برد.
آیا دو دادهٔ متفاوت میتوانند هش یکسان داشته باشند؟
از نظر ریاضی بله، چون تعداد ورودیهای ممکن بینهایت و تعداد خروجیها محدود است. اما یکی از شرطهای تابع هش رمزنگاری این است که پیدا کردن چنین دو ورودیای، که به آن برخورد میگویند، عملاً غیرممکن باشد.
منابع
- واژهنامهٔ NIST CSRC: تابع هش مشاهدهٔ منبع واژهنامهٔ NIST CSRC: تابع هش
- FIPS PUB 180-4 FEDERAL INFORMATION PROCESSING STANDARDS PUBLICATION مشاهدهٔ منبع FIPS PUB 180-4 FEDERAL INFORMATION PROCESSING STANDARDS PUBLICATION
- GitHub - ethereum/eth-hash: The Ethereum hashing function, keccak256, sometimes (erroneously) called sha256 or sha3 · GitHub مشاهدهٔ منبع GitHub - ethereum/eth-hash: The Ethereum hashing function, keccak256, sometimes (erroneously) called sha256 or sha3 · GitHub
- Block Chain — Bitcoin مشاهدهٔ منبع Block Chain — Bitcoin