SHA-256 إجراء محدد بدقة يحسب بصمة للبيانات تُسمّى hash. المدخل نفسه يعطي النتيجة نفسها دائماً، بطول 256 بت: أي 32 بايت، تُكتب عادةً في صورة 64 رمزاً بالنظام الست عشري. يستخدمه Bitcoin لربط البيانات والتحقق منها وفي التعدين. لكن البصمة ليست نسخة مشفّرة من المحتوى الأصلي.
تخيّل أن شخصاً أرسل إليك ملفاً ومعه قيمة hash الخاصة به. يمكنك حسابها بنفسك للتحقق من تطابق البيانات التي نزّلتها مع تلك البصمة. حتى التغيير الصغير في المدخل يُرجّح بدرجة عالية جداً أن يغيّر النتيجة بأكملها. لكن البصمة وحدها لا تخبرك بمن أنشأ الملف أو بما إذا كان آمناً. إذا استبدل المهاجم الملف وقيمة hash معاً، فسيتطابقان. لذلك تهمّ أيضاً موثوقية المصدر الذي أخذت منه القيمة المرجعية. [1] [5]
بالنسبة إلى بايتات ASCII الثلاثة abc، من دون علامات اقتباس أو سطر جديد، تكون النتيجة ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad. هذا ليس رقماً مولّداً عشوائياً: كل تنفيذ صحيح يعطي هذه النتيجة من البايتات نفسها بالضبط. إضافة مسافة أو سطر جديد تغيّر المدخل. اختلاف hash عندئذ لا يعني وجود خطأ في الخوارزمية. وترميز النص مهم أيضاً. [3]
يهدف التشفير إلى إتاحة استرجاع الرسالة باستخدام مفتاح. أما SHA-256 فليس له ذلك المفتاح ولا إجراء عكسي لاسترجاع الرسالة. لكن هذا لا يمنع تجربة المدخلات المحتملة: من يظن أنك حسبت بصمة PIN من أربعة أرقام يستطيع تجربة جميع الاحتمالات البالغ عددها 10,000 ومقارنة النتائج. البصمة الطويلة لا تضيف إلى السر الضعيف الإنتروبيا (أي صعوبة التنبؤ بالمدخل) التي يفتقدها. ويعتمد الأمان أيضاً على عدد الاحتمالات التي يحتاج المهاجم فعلاً إلى فحصها. [5] [7]
تستخدم معرّفات الكتل وtxid (معرّفات المعاملات) ودمج أزواج البصمات في Merkle Tree (شجرة من البصمات المترابطة) الصيغة SHA256(SHA256(data)). تعالج المرة الثانية البايتات الخام للنتيجة الأولى، وعددها 32 بايت، وليس تمثيلها النصي المؤلف من 64 رمزاً. وتبقى النتيجة بطول 256 بت. التجزئة المزدوجة هنا قاعدة في البروتوكول، وليست دليلاً على كسر SHA-256 المفرد. ويستخدم Bitcoin تراكيب أخرى أيضاً؛ فمثلاً يضيف Taproot وسوماً محددة مسبقاً إلى المدخل للفصل بين أغراض التجزئة المختلفة. [2] [4] [6]
يغيّر المعدّن مراراً الحقول المسموح بتغييرها في ترويسة كتلة مرشحة، ويحسب لها SHA-256 المزدوج. يبحث عن نتيجة لا تتجاوز target (الحد العددي) المحدد عند قراءتها كعدد. فهو لا يفك تشفير رسالة ولا يبحث عن مفتاح خاص لشخص آخر. العثور على ترويسة مناسبة يتطلب محاولات كثيرة، بينما التحقق منها سريع. وتشير الترويسة أيضاً إلى الكتلة السابقة، لذا فإن تغيير كتلة قديمة يخلّ بالروابط اللاحقة. ويتحقق Full Node (عقدة تتحقق بنفسها من قواعد Bitcoin) كذلك من المعاملات وبقية القواعد؛ فالبصمة المطابقة للشرط وحدها لا تجعل كتلة غير صالحة صالحة. [4]
عدد الرسائل الممكنة أكبر من عدد البصمات ذات 256 بت، لذا لا بد من وجود مدخلات مختلفة لها البصمة نفسها. هذا هو التصادم. السؤال المهم هو هل يمكننا العثور عليه عمداً. في دالة تجزئة مثالية بطول 256 بت، يحتاج البحث العام عن أي تصادم إلى نحو 2^128 محاولة، بينما يحتاج العثور على مدخل لبصمة محددة مسبقاً إلى نحو 2^256. هاتان مسألتان مختلفتان. العثور على تصادم لا يكشف بمفرده مفتاح Bitcoin الخاص. كما لا تضمن هذه الأرقام أمان محفظة أو بروتوكول كامل. [5]
SHA-256 مكوّن، وليس حلاً متكاملاً لكل مشكلة أمنية. صُمّم ليكون سريعاً، ولذلك لا يناسب وحده تخزين كلمات مرور يختارها البشر؛ إذ يستطيع المهاجم اختبار تخميناته بسرعة أيضاً. لهذا الغرض توجد إجراءات خاصة للاشتقاق من كلمات المرور، منها ما يسمح بضبط الكلفة الحسابية. وبالمثل، فإن الوصفة المرتجلة «أحسب بصمة شيء ما فأحصل على مفتاح آمن» لا تعالج ضعف العشوائية الأصلية ولا انكشاف المدخل. لا يحتاج المستخدم عادةً إلى حساب SHA-256 يدوياً، لكنه يحتاج إلى فهم ما تثبته البصمة التي تحقّق منها وما لا تثبته. [8] [7]
ينتمي SHA-256 إلى عائلة SHA-2، ويصف NIST FIPS 180-4 إجراءه. قبل الحساب يكمّل المدخل بحشو يتضمن معلومات عن طوله، ثم يعالجه في أجزاء من 512 بت، كل جزء عبر 64 جولة. هذه الكتل الداخلية حجمها 64 بايت وليست كتل Bitcoin. يبلغ حجم ترويسة كتلة Bitcoin مقدار 80 بايت، بينما تتضمن الكتلة الكاملة المعاملات أيضاً. الرقم 256 في الاسم يعبّر عن طول البصمة الناتجة، لا عن حجم الكتلة أو المفتاح الخاص. [1] [4]
للحصول على صورة أوضح، اقرأ هذا المدخل مع Hash, Proof of Work, Block Header, عنوان بيتكوين, Merkle Tree, Bitcoin. تشير إلى هذا المدخل أيضًا Hash, ASIC Miner, Hashrate, Nonce.