الگوریتم SHA-256 چیست؟ کاربرد SHA256 در بلاک چین و ارز دیجیتال
الگوریتم SHA-256
الگوریتم SHA-256 چیست؟ کاربرد SHA256 در بلاک چین و ارز دیجیتال

الگوریتم SHA-256 چیست؟ کاربرد SHA256 در بلاک چین و ارز دیجیتال

SHA256 یک تابع و الگوریتم هشینگ است که در صنایع مختلفی از جمله ارتباطات، مجوزهای امنیتی نظیر SSL و IPsec، بلاک چین و رمز ارزها و موارد بسیار دیگر کاربرد دارد. در این مطلب، ابتدا تاریخچه ساخت و توسعه الگوریتم SHA-256 را بررسی کرده و سپس به کاربردهای مختلف، نحوه کار و استفاده از آن برای رمزنگاری در فضای بلاک چین و استخراج ارز دیجیتال از جمله بیت کوین می‌پردازیم.

الگوریتم SHA 256 چیست؟

SHA که عموما «شا» خوانده می‌شود، مخفف عبارت “Secure Hash Algorithm” به‌معنای «الگویتم هش امن» است که برای رمزنگاری داده‌ها به‌کار می‌رود. SHA یک خانواده بزرگ از توابع هش مختلف شامل دو خانواده SHA-1 و SHA-2 است که هر کدام ورودی‌های دارای طول‌های متغیر را گرفته و آن‌ها را به یک خروجی با طول ثابت تبدیل می‌کنند.

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

تاریخچه ساخت تابع SHA-256

مشابه اکثر مفاهیم حوزه کریپتوگرافی، الگوریتم SHA نیز طی دوران جنگ توسعه داده شد. این الگوریتم رمزنگاری حاصل همکاری و تلاش‌های آژانس امنیت ملی ایالت متحده (NSA) و موسسه ملی فناوری و استاندارد (NIST) است.

در سال 1993، اولین پروتکل SHA به‌نام SHA-0 معرفی شد. با این حال، سازندگان طی مدت کوتاهی پس از انتشار، این الگوریتم را به‌خاطر یک «نقص فاحش» کنار گذاشته و ورژن بهبودیافته آن به‌نام SHA-1 (بخوانید شا وان) را منتشر کردند. در سال 2001، الگوریتم SHA-2 (بخوانید شا تو) معرفی شد که ابتدا دارای چهار نسخه بود و بعدا دو نسخه دیگر تکامل‌یافته نیز به آن اضافه شدند.

بنابراین در حالت کلی، خانواده SHA را به دو زیرخانواده SHA-1 و SHA-2. تقسیم می‌کنند:

  • SHA-1
  • SHA-2
    • SHA-224
    • SHA-256
    • SHA-384
    • SHA-512
    • SHA-512/224
    • SHA-512/256

تفاوت خانواده توابع هش SHA-1 و SHA-2 در طول خروجی آن‌هاست. SHA-1 دارای خروجی 160 بیتی و SHA-2 بسته به پسوند پس از آن، دارای خروجی‌های 224، 256، 238 و 512 بیتی هستند.

امنیت الگوریتم هش SHA-256 چقدر است؟

بر خلاف SHA-1، تابع هشینگ SHA-2 به امنیت و سرعت بالای خود شناخته می‌شود. بنابراین، SHA256 که زیرگروه خانواده بزرگ SHA-2 است نیز امنیت بسیار بالایی دارد. در مواردی نظیر

اثبات کار (PoW) استخراج بیت کوین که در آن کلیدها تولید نمی‌شوند، یک تابع هشینگ پرسرعت نظیر SHA-256 کارایی بالایی دارد.

همانطور که گفتیم، این الگوریتم توسط NSA و NIST توسعه داده شده است که با مراجعه به سند FIPS 180-4موسسه ملی استانداردها و فناوری می‌توانید جزئیات بیشتر آن را مطالعه نمایید.

الگوریتم هشینگ SHA256 چگونه کار می‌کند؟

برای درک نحوه کار تابع SHA-256 (که شا-تو فیفتی سیکس خوانده می‌شود)، ابتدا باید با مفهوم تابع هش آشنا شویم. در ادامه این قسمت، ابتدا نحوه کار هش فانکشن را بررسی کرده و سپس با بررسی جزئیات یک تابع SHA256، یک نمونه مثال عملی را با هم بررسی می‌کنیم.

تابع هش چیست؟

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

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

مثلا فرض کنید می‌خواهیم مجموعه «ارباب حلقه‌ها (Lord of The Rings)» نوشته «جان رونالد ریول تالکین (John Ronald Reuel Tolkien)» را به‌عنوان ورودی گرفته و با استفاده از الگوریتم SHA256، به یک هش تبدیل کنیم. با این کار، خروجی ما یک رشته منحصربه‌فرد 256 بیتی (32 بایت) خواهد بود که گاهی اوقات به آن “FingerPrint” یا «اثر انگشت» نیز می‌گویند. این خروجی برای عبارت “Lord of The Rings” همیشه یکسان خواهد بود. حالا در صورتی که حتی یک حرف در عبارت “Lord of The Rings” را تغییر دهیم، یک هش منحصربه‌فرد کاملا جدید و متفاوت خواهیم داشت.

البته از آنجایی که طول رشته خروجی یک تابع هش محدود است، این خروجی را «تقریبا منحصربه‌فرد» می‌نامند. مثلا به‌خاطر 256 بیتی بودن طول رشته خروجی‌های تابع هش SHA-256، همیشه یک خروجی تقریبا منحصربه‌فرد با طول ثابت 256 بیتی خواهیم داشت. با این وجود، طول ورودی یک تابع هش نامحدود است که می‌تواند در برخی موارد نارد به یک خروجی یکسان منجر شود. به این اتفاق بسیار نادر، «تصادم» یا “Collision” می‌گویند. البته از آنجایی که در یک تابع SHA 256 تعداد خروجی‌ها برابر 256^2 است، احتمال رخداد این اتفاق بسیار بعید و معادل رقم زیر خواهد بود:

3 هدف یک تابع هش شامل موارد زیر است:

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

 

گام‌های الگوریتم هشینگ SHA-256

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

  1. مرحله Padding – گرفتن ورودی و تبدیل آن به مضربی از 512 بیت دارای 64 بیت کمتر.
  2. گرفتن پیام و شکستن آن به N بلاک 512 بیتی
  3. تکرار مرحله 2 روی تمام بلاک‌ها:
    1. مقداردهی به Message Schedule؛ دنباله‌ای از 64 کلمه 32 بیتی (هر بلاک دارای 8 کلمه)
    2. مقداردهی به هشت متغیر a … h با مقادیر هش H0 … H7 حاصل از تکرار قبل (برای تکرار اول، H0 … H7 با یک عدد ثابت مقداردهی می‌شوند).
    3. انجام 64 تکرار که در آن‌ها متغیرهای a … h به‌روش خاصی چرخانده (Rotate) می‌شوند. این فرآیند، قلب تابع هشینگ ماست. در این مرحله، پیام با استفاده از تعداد بالایی ترکیب بیتی وارد تابع هش می‌شود.
    4. محاسبه مقادیر میانی هش جدید H0 … H7 به‌صورت H0 = H0 + a و H1 = H1 + b و به همین ترتیب تا آخر.
  4. الحاق H0 … H7 به‌عنوان دایجست (نتیجه) پیام و بازگردانی آن.

الگوریتم هش SHA-256 شامل 64 دور عملیات در هر بلاک است. هر بلاک نیز 512 بیت ورودی دارد که هر کدام به هشت کلمه 32 بیتی شکسته می‌شوند. حالا Message Schedule به حرکت این کلمات داخل الگوریتم اتلاق می‌شود.

چرخش یا Rotation هم فرآیندی مشابه شیفت دادن است، با این تفاوت که اعداد بیرون افتاده از یک انتها، از یک انتهای دیگر وارد می‌شوند. مثلا فرض کنید یک کلمه 8 بیتی به‌صورت 11100101 ذخیره شده است. 3 چرخش از چپ یعنی 3 باینری سمت چپ (111) را گرفته و آن را به انتهای دیگر از سمت راست اضافه می‌کنیم: 00101111. در حالت دیگر، 3 چرخش از راست یعنی 3 باینری راست (101) را گرفته و آن را به سمت چپ اضافه می‌کنیم: 10111100

1. پدینگ (Padding)

از نظر واژه شناسی، “Padding” یعنی «پر کردن». این فعالیت در زمینه‌های مختلفی نظیر تولید البسه و مبلمان (مثلا پر کردن کوسن با موارد نرم)، نویسندگی (اضافه کردن کلمات غالبا زائد جهت افزایش طول محتوا) و موارد دیگر به‌کار می‌رود. اما پدینگ در دنیای برنامه‌نویسی نظیر CSS و HTML معنی دیگری دارد.

در الگوریتم هشینگ SHA 256، مرحله پدینگ شامل اضافه کردن بیت‌های بیشتر به یک پیام است تا اندازه آن به دقیقا 64 بیت کمتر از 512 یا مضربی از آن تبدیل شود. در مرحله اضافه کردن بیت‌ها، باید اولین بیت اضافی 1 و بقیه 0 باشند.