# SHA-256 واقعاً چیست

> Cuadernos Lacre · مفهوم · ۱۹ مه ۲۰۲۶
> https://solo2.net/fa/notebooks/articulos/what-sha-256-actually-is.html

اثر انگشت ریاضی که در شصت و چهار کاراکتر جا می‌شود و اگر تنها یک کامای متن اصلی جابه‌جا شود، کل آن تغییر می‌کند. چرا ما به آن مهر موم دیجیتال می‌گوییم.

---

## ایده ساده پشت نام فنی

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

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

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

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

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

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

## چهار ویژگی که یک هش رمزنگارانه را مفید می‌کند

یک تابع هش که شایسته صفت *رمزنگارانه* باشد، چهار ویژگی را برآورده می‌کند:

1. قطعیت (Determinism). ورودی یکسان همیشه اثر انگشت یکسانی تولید می‌کند.
2. اثر بهمنی (Avalanche effect). تغییری کوچک در ورودی، اثر انگشتی کاملاً متفاوت تولید می‌کند، بدون هیچ شباهت ظاهری به قبلی.
3. مقاومت در برابر معکوس‌سازی (Pre-image resistance). با داشتن یک اثر انگشت، از نظر محاسباتی پیدا کردن متنی که آن را تولید کرده، امکان‌پذیر نیست.
4. مقاومت در برابر تصادم (Collision resistance). از نظر محاسباتی پیدا کردن دو متن متفاوت که اثر انگشت یکسانی تولید کنند، امکان‌پذیر نیست.

«از نظر محاسباتی امکان‌پذیر نیست» به معنای «از نظر ریاضی غیرممکن است» نیست. بلکه به این معناست که هزینه زمانی، انرژی و مالی برای دستیابی به آن، چندین برابر مجموع تمام توان محاسباتی در دسترس است. برای SHA-256، این حد حتی در خوش‌بینانه‌ترین حالت‌ها با سخت‌افزار تخصصی، میلیاردها میلیارد سال تخمین زده می‌شود. که برای اهداف کاربردی خواننده، همان «نمی‌شود» است.

## به طور مشخص SHA-256

نام آن گویای همه چیز است. SHA مخفف *Secure Hash Algorithm* به معنای الگوریتم هش امن است. عدد ۲۵۶ اندازه اثر انگشت را به بیت نشان می‌دهد: دویست و پنجاه و شش بیت، یعنی سی و دو بایت، که در حالت هگزادسیمال همان شصت و چهار کاراکتری است که خواننده از قبل می‌شناسد. این استاندارد توسط NIST ایالات متحده، سازمانی که این نوع توابع را استانداردسازی می‌کند، در سال ۲۰۰۱ به عنوان بخشی از خانواده SHA-2 منتشر شد؛ نسخه فعلی استاندارد، FIPS 180-4، مربوط به سال ۲۰۱۵ است.

ابعاد آن ارزش یک لحظه تأمل را دارد. دویست و پنجاه و شش بیت، اجازه ۲ به توان ۲۵۶ مقدار متفاوت را می‌دهد: عددی با هفتاد و هشت رقم اعشار، چندین برابر بزرگتر از تعداد تخمینی اتم‌ها در جهان قابل مشاهده. هر متن در جهان - هر کتاب، هر ایمیل، هر پیام - روی یکی از این مقادیر می‌افتد. احتمال اینکه دو متن متفاوت به طور تصادفی با هم یکی شوند، برای اهداف کاربردی، صفر است.

## در کد چگونه دیده می‌شود

## چرا ما به آن مهر موم می‌گوییم

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

مقدار SHA-256 بدنه هر Cuaderno همان عملکرد را در نسخه دیجیتال خود ایفا می‌کند. اگر تنها یک کلمه از مقاله بین لحظه انتشار و لحظه خواندن شما تغییر کند، مهر هگزادسیمال پایین متن دیگر با SHA-256 متنی که در مقابل دارید مطابقت نخواهد داشت. هر خواننده‌ای با پنج خط کد می‌تواند این را بررسی کند. ناشر نمی‌تواند تاریخ خود را بدون اینکه مهر آن را لو دهد، بازنویسی کند. از آسیب محافظت نمی‌کند؛ بلکه آن را قابل تأیید می‌کند.

## آنچه یک هش نیست

گاهی اوقات از SHA-256 انتظارهایی می‌رود که مربوط به آن نیست:

1. رمزگذاری. یک هش خلاصه می‌کند، پنهان نمی‌کند. اگر می‌خواهید متن قابل خواندن نباشد، باید آن را رمزگذاری کنید، نه هش.
2. احراز هویت نویسنده. یک هش نمی‌گوید چه کسی متن را نوشته است، فقط می‌گوید چه متنی هش شده است. برای مرتبط کردن نویسندگی، به یک امضای رمزنگارانه روی هش نیاز است، نه صرفاً خود هش.
3. ذخیره رمزهای عبور. اینجا تله‌ای وجود دارد که بهتر است درک شود. SHA-256 طوری طراحی شده که بسیار سریع باشد - که برای خیلی چیزها خوب است، اما برای این کار بد. یک مهاجم با سخت‌افزار تخصصی می‌تواند میلیاردها رمز عبور را در ثانیه در مقابل یک هش SHA-256 آزمایش کند تا به رمز شما برسد. برای ذخیره رمزهای عبور، باید از توابع اشتقاق کلید (Key Derivation Functions) که عمداً کند هستند مانند Argon2، scrypt یا bcrypt استفاده کرد، همراه با یک *نمک* (salt) (یک داده تصادفی منحصر به فرد برای هر کاربر که مانع از آن می‌شود که دو نفر با رمز عبور یکسان، هش یکسانی داشته باشند).
4. خواندن هش به عنوان شناسه نویسنده. این‌طور نیست. یک هش محتوا را شناسایی می‌کند. اگر دو نفر کلمه *سلام* را با SHA-256 هش کنند، هر دو خلاصه یکسانی به دست می‌آورند - و این ویژگی اصلی است، نه یک نقص: اگر خلاصه‌ها متفاوت بودند، نمی‌توانستیم مطابقت بین آنچه منتشر شده و آنچه دریافت شده را بررسی کنیم.

## SHA-256 در زندگی روزمره شما کجا ظاهر می‌شود

اگرچه آن را نمی‌بینید، اما SHA-256 بخش بزرگی از آنچه را که روزانه در اینترنت استفاده می‌کنید، پشتیبانی می‌کند. بلاک‌چین بیت‌کوین با زنجیر کردن SHA-256 هر بلاک به بلاک بعدی ساخته می‌شود؛ تغییر یک بلاک در گذشته، محاسبه مجدد کل زنجیره بعدی را اجباری می‌کند. Git، سیستمی که نیمی از کدهای دنیا با آن نسخه‌بندی می‌شوند، هر کامیت را با SHA-256 (در نسخه‌های جدید) یا با نسخه قبلی آن یعنی SHA-1 (در نسخه‌های قدیمی) از کل محتوای آن شناسایی می‌کند. گواهی‌های HTTPS که هویت یک وب‌سایت را هنگام ورود شما تأیید می‌کنند، یک اثر انگشت SHA-256 همراه خود دارند. دانلودهای نرم‌افزار اغلب با یک SHA-256 منتشر شده توسط توسعه‌دهنده همراه هستند تا بتوانید بررسی کنید که فایل در طول مسیر تغییر نکرده است. و همان‌طور که گفتیم، در پایین هر Cuaderno Lacre.

## برای خواننده حرفه‌ای

چهار یادآوری عملیاتی برای کسانی که در مورد سیستم‌ها تصمیم می‌گیرند یا آن‌ها را ممیزی می‌کنند:

1. هش، رمزگذاری نیست. اگر یک ارائه‌دهنده این دو اصطلاح را در اسناد فنی خود اشتباه بگیرد، بهتر است بپرسید منظورش دقیقاً چیست.
2. برای ذخیره رمزهای عبور هرگز نباید از SHA-256 به تنهایی استفاده کرد. SHA-256 برای این کار بسیار سریع است (به نقطه ۳ در بخش *آنچه یک هش نیست* مراجعه کنید). استاندارد فعلی Argon2id است: در طراحی کند، قابل تنظیم بر اساس توان سرور، و همراه با یک *نمک* تصادفی متفاوت برای هر کاربر.
3. برای یکپارچگی اسناد - قراردادها، پرونده‌ها، فایل‌ها - SHA-256 همچنان استاندارد مرجع است. این همان چیزی است که مهرهای زمانی معتبر در اتحادیه اروپا از آن استفاده می‌کنند.
4. برای نگهداری طولانی‌مدت (چندین دهه)، بهتر است در کنار SHA-256، یک SHA-3 یا SHA-512 را نیز محاسبه و آرشیو کنید؛ احتیاط رمزنگارانه توصیه می‌کند در آرشیوهای صدساله به یک تابع واحد تکیه نکنید.

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

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

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

SHA-256 از نظر ریاضی همین مدار است. متنی که می‌نویسید، موقعیت اولیه مهره‌هاست. الگوریتم، همان ضربه‌ای است که بهمن را رها می‌کند. و نتیجه نهایی - چیزی که ما به آن *هش* (hash) می‌گوییم - عکس ثابتی از زمین است، وقتی همه چیز متوقف شده باشد. تنها یک کاما را در متن اصلی تغییر دهید و عکس به کلی متفاوت خواهد شد. به همین سادگی و به همین شدت.

---

*اگر به پایین این مقاله برگردید، یک مهر هگزادسیمال شصت و چهار کاراکتری خواهید دید. این SHA-256 متنی است که به این زبان خواندید. اگر مقاله را ترجمه می‌کردیم، مهر متفاوت می‌بود؛ اگر یک کلمه از نسخه اسپانیایی تغییر می‌کرد، مهر اسپانیایی تغییر می‌کرد. مهر از محتوا محافظت نمی‌کند - ابزارهای دیگری برای آن وجود دارد - بلکه آن را به طور منحصر به فرد شناسایی می‌کند. و این، هرچند ساده به نظر برسد، کافی است تا هیچ مرحله‌ای از زنجیره تحریریه نتواند آنچه گفته شده را بدون اینکه متوجه شوید، تغییر دهد. بقیه موارد - رمزگذاری، امضا، شناسایی - بر روی این ایده ساده ساخته می‌شوند.*

## منابع و مطالعه بیشتر

- NIST — *FIPS PUB 180-4: Secure Hash Standard (SHS)*، اوت ۲۰۱۵. مشخصات رسمی خانواده SHA-2، شامل SHA-256.
- RFC 6234 — *US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)*، IETF، مه ۲۰۱۱. نسخه هنجاری برای پیاده‌سازان.
- Ferguson, N.; Schneier, B.; Kohno, T. — *Cryptography Engineering: Design Principles and Practical Applications* (Wiley, 2010). فصل‌های ۵ و ۶ توابع هش و استفاده‌های مشروع و نامشروع آن‌ها را پوشش می‌دهند.
- Nakamoto, S. — Bitcoin: A Peer-to-Peer Electronic Cash System (2008). نمونه عملی استفاده از SHA-256 برای زنجیره بلاک‌ها در ساختاری که ذاتاً تغییرناپذیر است.
- مقررات (EU) 910/2014 (eIDAS) — چارچوب مهرهای زمانی معتبر. SHA-256 تابع مرجع برای امضاها و مهرهای الکترونیکی معتبری است که در اتحادیه اروپا صادر می‌شوند.
- پیاده‌سازی مرجع در Zig: std.crypto.hash.sha2.Sha256 در مخزن رسمی زبان (*github.com/ziglang/zig* ← lib/std/crypto/sha2.zig). این نسخه بهینه شده و ممیزی شده‌ای است که Solo2 در واقع از آن استفاده می‌کند. مفید برای مقایسه با پیاده‌سازی آموزشی در پیوست.

---

*Cuadernos Lacre · نشريّة من Menzuri Gestión S.L. · كتبها R.Eugenio · حرّرها فريق Solo2.*
*https://solo2.net/fa/notebooks/*
