⛓ دانشکدهٔ ۲ · رمزنگاری کاربردی
تابع هش و SHA-256
Hash functions and SHA-256
پیشنیازها: ساختار بلاک و زنجیرهشدن بلاکها
📚 آموزش در سه سطح
از سطح ساده شروع کنید؛ اگر روشن بود، سطح بعد را بخوانید. سطح مناسب شما ذخیره میشود.
🌱 توضیح ساده
تابع هش مثل یک دستگاه اثر انگشتگیری برای داده است. هر چیزی به آن بدهید، یک کلمه، یک کتاب کامل یا یک فیلم، خروجی همیشه رشتهای با طول ثابت است. در SHA-256 این خروجی ۲۵۶ بیت است که معمولاً به شکل ۶۴ نویسهٔ شانزدهشانزدهی (هگز) نمایش داده میشود. اگر همان ورودی را صد بار بدهید، صد بار همان خروجی را میگیرید؛ ولی اگر فقط یک حرف، یک فاصله یا یک نقطه را عوض کنید، خروجی چنان تغییر میکند که انگار هیچ ربطی به خروجی قبلی ندارد.
یک تفاوت مهم با قفل و کلید وجود دارد: هش «رمزگذاری» نیست. از روی اثر انگشت نمیتوان خود آدم را ساخت؛ از روی هش هم نمیتوان دادهٔ اصلی را به دست آورد. هش فقط برای «مقایسه» و «اثبات یکسانبودن» به کار میرود. اگر کسی فایل نصب یک کیف پول را برایتان بفرستد، میتوانید هش آن را با هشی که سازندهٔ رسمی منتشر کرده مقایسه کنید؛ اگر یکی بود، مطمئن میشوید فایل در مسیر دستکاری نشده است.
در بلاکچین تقریباً همهچیز به هش تکیه دارد: شناسهٔ هر تراکنش هش آن است، هر بلاک با هش به بلاک قبلی وصل میشود، ریشهٔ مرکل از هش تراکنشها ساخته میشود، آدرسها از هش کلید عمومی به دست میآیند و استخراج بیتکوین در اصل مسابقهای برای پیداکردن هشی با تعداد کافی صفر در ابتدای آن است.
📘 توضیح متوسط
یک تابع هش رمزنگاری خوب باید سه ویژگی امنیتی داشته باشد. «مقاومت در برابر یافتن پیشتصویر»: با داشتن خروجی، پیداکردن ورودیای که به آن برسد عملاً ناممکن باشد. «مقاومت در برابر پیشتصویر دوم»: با داشتن یک ورودی مشخص، نتوان ورودی دیگری با همان هش ساخت. «مقاومت در برابر برخورد»: نتوان هیچ دو ورودی متفاوتی با هش یکسان پیدا کرد. علاوه بر اینها، تابع باید سریع محاسبه شود و «اثر بهمنی» داشته باشد؛ یعنی تغییر یک بیت از ورودی بهطور میانگین حدود نیمی از بیتهای خروجی را برگرداند.
SHA-256 عضو خانوادهٔ SHA-2 است که سازمان امنیت ملی آمریکا طراحی و مؤسسهٔ ملی استاندارد و فناوری آمریکا (NIST) در سال ۲۰۰۱ منتشر کرد و در استاندارد FIPS 180-4 تعریف شده است. یک بردار آزمون رسمی: هش رشتهٔ abc برابر ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad است و هش رشتهٔ خالی با e3b0c442 شروع میشود. اگر در آزمایشگاه هش آکادمی abc را وارد کنید و دقیقاً همین خروجی را ببینید، میدانید پیادهسازی درست کار میکند.
بیتکوین برای هش بلاک و شناسهٔ تراکنش از SHA-256 دوگانه استفاده میکند، یعنی SHA-256 را دو بار پشت سر هم اجرا میکند. اثبات کار بیتکوین هم بر اساس احتمال است: چون خروجی هش در عمل تصادفی به نظر میرسد، احتمال اینکه نخستین نویسهٔ هگز صفر باشد ۱ از ۱۶ است، احتمال دو صفر ۱ از ۲۵۶ و در کل هر صفر اضافه تعداد آزمونهای لازم را ۱۶ برابر میکند. هیچ راه میانبُری برای «حدسزدن» نانس مناسب وجود ندارد؛ فقط باید امتحان کرد.
🔬 توضیح تخصصی
امنیت در برابر برخورد بهدلیل «پارادوکس روز تولد» نصف طول خروجی است: برای یک تابع ایدئال با خروجی n بیتی، یافتن برخورد حدود ۲ به توان n/2 تلاش لازم دارد. پس SHA-256 در برابر برخورد حدود ۱۲۸ بیت امنیت دارد و در برابر پیشتصویر حدود ۲۵۶ بیت. این تفاوت در طراحی اهمیت دارد: آدرسهای P2SH بیتکوین که روی هش ۱۶۰ بیتی بنا شدهاند، در سناریوهایی که مهاجم بتواند در ساختن اسکریپت مشارکت کند، فقط حدود ۸۰ بیت امنیت برخورد دارند؛ یکی از دلایل استفاده از هش ۲۵۶ بیتی در P2WSH و Taproot همین است.
SHA-256 بر ساختار مرکل-دامگارد بنا شده و در برابر «حملهٔ افزایش طول» آسیبپذیر است: اگر کسی هش رشتهٔ S را بداند، بدون دانستن S میتواند هش رشتهٔ S بهاضافهٔ یک پسوند خاص را حساب کند. به همین دلیل ساختن کد احراز اصالت به شکل سادهلوحانهٔ «هش کلید پشت پیام» خطرناک است و باید از HMAC استفاده کرد. SHA-3 (Keccak) ساختار اسفنجی دارد و این آسیبپذیری را ندارد. اتریوم از Keccak-256 استفاده میکند که با SHA3-256 نهایی استاندارد NIST در قاعدهٔ پرکردن (padding) فرق دارد؛ بنابراین خروجی این دو برای یک ورودی یکسان نیست و جابهجا به کاربردن آنها خطای رایج برنامهنویسان است.
سریعبودن SHA-256 برای بلاکچین مزیت است ولی برای ذخیرهٔ رمز عبور عیب: مهاجمی که پایگاه دادهٔ هش رمزها را بدزدد، میتواند میلیاردها حدس در ثانیه را امتحان کند. برای رمز عبور باید از توابع کند و حافظهبر مانند Argon2، scrypt یا PBKDF2 با «نمک» استفاده کرد. همین منطق دربارهٔ «کیف پول ذهنی» (brainwallet) صدق میکند: کلید خصوصیای که از هش یک جملهٔ قابل حدس ساخته شود، با فرهنگلغت و جملات مشهور بهسرعت پیدا میشود. هش فقط وقتی امن است که ورودی آن از فضای بزرگ و غیرقابل حدسی آمده باشد.
🌍 مثال واقعی: شکست SHA-1 در عمل: حملهٔ SHAttered (۲۳ فوریهٔ ۲۰۱۷)
در ۲۳ فوریهٔ ۲۰۱۷ پژوهشگران گوگل و مؤسسهٔ CWI آمستردام اعلام کردند دو فایل PDF متفاوت ساختهاند که هش SHA-1 یکسانی دارند؛ یعنی نخستین برخورد عملی SHA-1. این کار حدود ۲ به توان ۶۳ محاسبهٔ SHA-1 نیاز داشت که برای آن زمان رقمی عظیم ولی در دسترس یک سازمان بزرگ بود.
SHA-1 خروجی ۱۶۰ بیتی دارد و از سالها قبل ضعفهای نظریاش شناخته شده بود. SHAttered نشان داد «نظری» در رمزنگاری دیر یا زود «عملی» میشود؛ مرورگرها و سامانههایی مثل Git مهاجرت به جایگزینهای امنتر یا سختکردن پیادهسازی را جدیتر گرفتند.
درس این رویداد برای بلاکچین: امنیت کل شبکه به فرضهای رمزنگاری گره خورده است. SHA-256 تا امروز برخورد شناختهشدهای ندارد، اما طراحان پروتکلها باید مسیر جایگزینی تابع را از قبل در نظر داشته باشند. شرح و فایلهای این حمله در وبسایت shattered.io منتشر شده است.
🔤 واژگان تخصصی
تابعی قطعی که ورودی با هر طولی را به خروجی با طول ثابت تبدیل میکند و یافتن پیشتصویر، پیشتصویر دوم یا برخورد برای آن عملاً ناممکن است.
مثال: SHA-256 هر ورودی را به ۲۵۶ بیت یا ۶۴ نویسهٔ هگز تبدیل میکند.
ویژگیای که در آن تغییر یک بیت از ورودی بهطور میانگین حدود نیمی از بیتهای خروجی را تغییر میدهد.
مثال: هش «salam» و «Salam» هیچ شباهت قابل تشخیصی با هم ندارند.
دشواری یافتن دو ورودی متفاوت با هش یکسان؛ برای خروجی n بیتی، امنیت ایدئال آن حدود n/2 بیت است.
مثال: SHAttered در ۲۰۱۷ این ویژگی را برای SHA-1 بهطور عملی شکست.
ورودیای که هش آن برابر یک خروجی مشخص است؛ مقاومت در برابر پیشتصویر یعنی از روی هش نتوان ورودی را پیدا کرد.
مثال: از روی txid نمیتوان محتوای تراکنش را ساخت؛ تراکنش باید جداگانه از نودها گرفته شود.
اجرای دو بار پشتسرهم SHA-256 که بیتکوین برای هش بلاک و شناسهٔ تراکنش به کار میبرد.
مثال: هش هر بلاک بیتکوین برابر SHA-256 خروجی SHA-256 سربرگ ۸۰ بایتی است.
🔑 نکات کلیدی
- هش ورودی دلخواه را به خروجی ثابت تبدیل میکند، قطعی است و رمزگذاری نیست؛ از هش نمیتوان داده را بازسازی کرد.
- سه ویژگی امنیتی: مقاومت در برابر پیشتصویر، پیشتصویر دوم و برخورد؛ امنیت برخورد حدود نصف طول خروجی است.
- اثر بهمنی باعث میشود کوچکترین تغییر در تراکنش یا بلاک، هش را کاملاً عوض کند.
- در اثبات کار هر صفر هگز اضافه در ابتدای هش، میانگین تعداد آزمونها را ۱۶ برابر میکند.
- سریعبودن SHA-256 برای رمز عبور و کیف پول ذهنی خطرناک است؛ آنجا باید از توابع کند با نمک استفاده کرد.
⚠️ اشتباهات رایج
- اینکه هش را نوعی رمزگذاری بدانیم که با کلید باز میشود؛ هش کلید ندارد و برگشتپذیر نیست.
- فرض اینکه دو ورودی «شبیه» هشهای شبیه دارند؛ اثر بهمنی دقیقاً خلاف این را تضمین میکند.
- ساختن کلید خصوصی از هش یک جملهٔ معروف یا قابل حدس؛ مهاجمان فهرست عظیمی از چنین جملههایی را امتحان میکنند.
- جابهجا به کاربردن Keccak-256 و SHA3-256 در کد؛ خروجی آنها برای یک ورودی یکسان متفاوت است.
🛠 تمرین عملی: آزمایش اثر بهمنی و اثبات کار کوچک
- آزمایشگاه هش آکادمی را باز کنید و رشتهٔ abc را وارد کنید؛ خروجی را با بردار آزمون این درس مقایسه کنید.
- یک جملهٔ کوتاه بنویسید و هش آن را ذخیره کنید؛ سپس فقط یک حرف را بزرگ یا کوچک کنید و دوباره هش بگیرید.
- تعداد نویسههای هگزی را که در دو خروجی در یک جایگاه یکسان ماندهاند بشمارید.
- به جملهٔ خود عدد ۰، ۱، ۲ و … اضافه کنید تا هشی پیدا کنید که با یک صفر شروع شود؛ تعداد تلاشها را بنویسید.
- حساب کنید برای چهار صفر در ابتدای هش بهطور میانگین چند تلاش لازم است و آن را با تجربهٔ خودتان مقایسه کنید.
✅ معیار درستی: خروجی abc باید دقیقاً با ba7816bf…15ad یکی باشد؛ در دو هش جملههای تقریباً یکسان فقط حدود ۴ نویسه از ۶۴ نویسه بهطور تصادفی در جای خود یکسان میماند؛ برای یک صفر حدود ۱۶ و برای چهار صفر حدود ۶۵۵۳۶ تلاش بهطور میانگین لازم است.
🔒 در هیچ تمرینی از سرمایهٔ واقعی، عبارت بازیابی (Seed Phrase)، کلید خصوصی یا اتصال کیف پول اصلی استفاده نکنید.
📝 آزمون تطبیقی
هر بار ۵ سؤال از بانک ۹ سؤالی این درس انتخاب میشود؛ سؤالهایی که قبلاً اشتباه زدهاید زودتر برمیگردند. حدنصاب قبولی ۸۰٪ (۴ از ۵) است و درس بعد با قبولی باز میشود.
✍️ پرسش تشریحی
سه نقش متفاوت تابع هش در بیتکوین را نام ببرید (مثلاً شناسهٔ تراکنش، زنجیرهکردن بلاکها، اثبات کار) و توضیح دهید هر نقش به کدام ویژگی امنیتی هش تکیه دارد.
بعد از نوشتن، پاسخ خود را با این معیارها بسنجید
خودارزیابی: هر نکتهای را که پاسخ شما بهروشنی پوشش داده علامت بزنید.
🤖 دستیار آموزشی
دستیار آفلاین آکادمی: پاسخها فقط از متن درسها و واژگان همین آکادمی پیدا میشوند و منبع هر پاسخ نشان داده میشود. هوش مصنوعی مولد نیست، حدس نمیزند و هیچ سیگنال خرید و فروشی نمیدهد.
📎 منابع مطالعاتی
- NIST CSRC — Hash Functions
- SHAttered — first practical SHA-1 collision
- Bitcoin Developer Reference — Block Chain
🏁 معیار تسلط بر این درس: بتوانید سه ویژگی امنیتی هش را با مثال توضیح دهید، تعداد آزمونهای لازم برای k صفر هگز را حساب کنید و بگویید چرا SHA-256 برای ذخیرهٔ رمز عبور مناسب نیست.