التخطي إلى المحتوى
Toova
جميع الأدوات

MD5 مقابل SHA-256 مقابل SHA-512 — شرح دوال التجزئة

Toova

دوال التجزئة موجودة في كل مكان في تطوير البرمجيات: التحقق من سلامة الملفات وتخزين كلمات المرور والتوقيعات الرقمية ومصادقة API ومفاتيح التخزين المؤقت وتخصيص البيانات المكررة. ومع ذلك يتعامل معظم المطورين معها كصناديق سوداء — تُدخِل سلسلة وتحصل على ملخص هكسادسي ثابت الطول. تفاصيل أي دالة تجزئة تستخدم وأيها تتجنب تبيَّن أنها مهمة للغاية.

MD5 مكسور. SHA-1 منتهي الصلاحية. SHA-256 وSHA-512 آمنان حالياً. SHA-3 موجود إن أردت الأمان المستقبلي. لكن "مكسور" لا يعني الشيء ذاته في كل سياق — MD5 مناسب لبعض حالات الاستخدام وخاطئ بشكل كارثي في حالات أخرى. يشرح هذا الدليل الخصائص المهمة، وكيف يقف كل دالة أمامها، ويمنحك إطاراً قرارياً واضحاً لاختيار التجزئة الصحيحة في 2026.

ما تفعله دالة التجزئة فعلياً

دالة التجزئة التشفيرية تُربِّط مدخلاً بطول اعتباطي بمخرج ثابت الطول (الملخص أو التجزئة). ثلاث خصائص تُعرِّف دالة التجزئة المؤمَّنة تشفيرياً:

  • مقاومة الصورة الأولية — بإعطاء تجزئة h، يجب أن يكون من غير الممكن حسابياً إيجاد أي مدخل m بحيث hash(m) = h. هذه هي خاصية "الاتجاه الواحد".
  • مقاومة الصورة الثانية — بإعطاء مدخل m1، يجب أن يكون من غير الممكن إيجاد مدخل مختلف m2 بحيث hash(m1) = hash(m2).
  • مقاومة التصادم — يجب أن يكون من غير الممكن إيجاد أي مدخلَيْن مميزَيْن m1 وm2 بحيث hash(m1) = hash(m2).

أي دالة تفشل في أي من هذه الخصائص تُعتبر مكسورة للاستخدام التشفيري. لاحظ أن "مستحيل حسابياً" له معنى محدد هنا: لا يعني مستحيلاً رياضياً، بل يعني يتطلب حسابات أكثر مما هو عملي بالأجهزة الحالية أو المتوقعة.

إضافةً إلى ذلك، تُظهر دوال التجزئة التشفيرية تأثير الانهيار الجليدي: تغيير بت واحد في المدخل ينتج مخرجاً يختلف في ما يقارب نصف بتاته. هذا يضمن أن المدخلات المتشابهة تُنتج ملخصات مختلفة تماماً.

Input:  "hello"
MD5:    5d41402abc4b2a76b9719d911017c592  (128-bit / 32 hex chars)

Input:  "Hello"
MD5:    8b1a9953c4611296a827abf8c47804d7  (one character change = completely different output)

MD5 — سريع وشائع ومكسور

التاريخ والتصميم

صمَّم رون ريفست MD5 (ملخص الرسالة 5) عام 1991 وينتج ملخصاً بطول 128 بت (16 بايت). لمعظم التسعينيات كان الخيار القياسي للتحقق من سلامة الملفات وتوقيع الشهادات وتجزئة كلمات المرور. إنه سريع جداً — يمكن للمعالج الحديث حساب عشرات الملايين من تجزئات MD5 في الثانية، ووحدة المعالجة الرسومية مليارات منها.

لماذا MD5 مكسور

في عام 2004، أثبتت شياويون وانغ وزملاؤها هجوم تصادم عملي ضد MD5 — ملفان مختلفان ينتجان التجزئة ذاتها. يعمل الهجوم في دقائق على أجهزة المستهلكين. في عام 2008، أنشأ باحثون شهادة CA مزيَّفة باستخدام تصادم MD5، مُثبِتين أن البنية التحتية لـ PKI في العالم الحقيقي كانت معرَّضة للخطر. في عام 2012، استخدمت برمجية Flame الخبيثة تصادم MD5 لتزوير شهادة توقيع أكواد مايكروسوفت.

أوقف NIST رسمياً استخدام MD5 لمعظم الأغراض التشفيرية. توقفت السلطات المصدِّقة للشهادات عن إصدار شهادات موقَّعة بـ MD5 بحلول عام 2009. أزال موردو المتصفحات دعم توقيعات شهادات MD5 حوالي عام 2011.

متى لا يزال MD5 مقبولاً

MD5 ليس عديم الفائدة كلياً. لمجاميع الفحص غير الأمنية — اكتشاف تلف البيانات العرضي في نقل الملفات، والعنونة القائمة على المحتوى في نظام تخزين مؤقت لا يمكن للمهاجم التأثير في مدخلاته، أو توليد معرِّفات فريدة في نظام داخلي مغلق — يظل MD5 كافياً. الاختبار الرئيسي: إذا كان بإمكان المهاجم الاستفادة من إنشاء تصادم، لا تستخدم MD5. إذا كان الأمر يتعلق بالتلف العرضي فحسب، فـ MD5 جيد.

  • آمن: تخصيص البيانات المكررة الداخلي، ومفاتيح التخزين المؤقت، واكتشاف تغيير الملفات غير الأمني
  • غير آمن: الشهادات والتوقيعات الرقمية وتجزئة كلمات المرور والتحقق من صحة الملفات والرموز الأمنية

SHA-1 — منتهي الصلاحية لكن لم يختفِ بعد

ينتج SHA-1 ملخصاً بطول 160 بت وكان خلف MD5. ظل معياراً لتوقيع الشهادات وتوقيع الكود لمعظم سنوات الألفية الثانية. في عام 2017، أثبت هجوم SHAttered أول تصادم عملي لـ SHA-1، مُنتِجاً ملفَّيْن مختلفَيْن بتجزئات SHA-1 متطابقة باستخدام ما يقارب 110 سنوات GPU — مكلف لكنه في نطاق ميزانيات الدول القومية وبات أكثر إمكانية بشكل متزايد.

SHA-1 منتهي الصلاحية بموجب NIST وجميع سلطات الشهادات الكبرى. لا يجب استخدامه للشهادات أو توقيع الكود أو أي تطبيق أمني جديد. لا تزال بعض الأنظمة القديمة تستخدم SHA-1 داخلياً، لكن الانتقال إلى SHA-256 موصى به بشدة. لا يزال Git يستخدم SHA-1 لمعالجة الكائنات (رغم أن التحول إلى SHA-256 جارٍ)، لكن هذا في طور التخلص منه.

SHA-256 — المعيار الحالي

SHA-256 جزء من عائلة SHA-2، صمَّمه NSA ووضع NIST معياره في FIPS 180-4. ينتج ملخصاً بطول 256 بت (32 بايت). خضع SHA-256 لتحليل مكثَّف منذ نشره عام 2001 ولم يُكتشف أي هجوم عملي. وهو المعيار الفعلي لـ:

  • شهادات TLS (جميع الشهادات الصادرة اليوم تستخدم SHA-256 تقريباً)
  • توقيع الكود (Windows Authenticode وأداة Apple notarization وملفات JAR)
  • HMAC-SHA256 لمصادقة API (AWS Signature v4 وGitHub webhook verification)
  • توقيعات رمز JWT (كلٌّ من HS256 وRS256 يستخدمان SHA-256 داخلياً)
  • معرِّفات معاملات Blockchain (Bitcoin يستخدم SHA-256 المضاعف)
  • التحقق من سلامة الملفات في مديري الحزم (npm وpip وapt)
Input:  "hello"
SHA-256: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
         (256-bit / 64 hex chars)

SHA-512: 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d
         99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043
         (512-bit / 128 hex chars)

أداء SHA-256

يستخدم SHA-256 عمليات كلمات 32 بت داخلياً. على الأجهزة 32 بت أو المعالجات القديمة دون تسريع برمجي، يكون أبطأ ملحوظاً من MD5. على المعالجات الحديثة 64 بت التي تحتوي على امتدادات SHA (Intel Goldmont+ وAMD Zen+ وApple Silicon وARM Cortex-A57+)، يكون SHA-256 مُسرَّعاً برمجياً وسريعاً جداً — قريباً في الغالب من سرعات MD5. معظم بيئات الخوادم تمتلك تسريعاً برمجياً، لذا فـ SHA-256 سريع بما يكفي لجميع التطبيقات تقريباً.

SHA-512 — أوسع وأحياناً أسرع

ينتج SHA-512 ملخصاً بطول 512 بت (64 بايت) باستخدام عمليات كلمات 64 بت داخلياً. على الأجهزة 64 بت بدون امتدادات SHA، قد يكون SHA-512 في الواقع أسرع من SHA-256 لأن عملياته 64 بت تستغل عروض السجلات الحديثة بشكل أفضل. على الأجهزة التي تمتلك امتدادات SHA، يكون SHA-256 أسرع عادةً لأن الامتدادات مُحسَّنة خصيصاً له.

يوفر SHA-512 هامش أمان أكبر — مقاومة تصادم 256 بت مقابل 128 بت لـ SHA-256. لمعظم نماذج التهديد الحالية، مقاومة التصادم 128 بت لـ SHA-256 أكثر من كافية (كسرها سيتطلب ما يقارب 2^128 عملية). SHA-512 مناسب عندما:

  • تستهدف خوادم 64 بت وتريد أقصى قدر من الإنتاجية بدون امتدادات برمجية
  • تحتاج إلى ملخصات أطول كمادة مفاتيح لعمليات تشفيرية أخرى
  • تريد هامش أمان إضافي لبيانات يجب أن تظل محمية لعقود
  • تُطبِّق بروتوكولات تستدعي SHA-512 تحديداً (مثلاً بعض مجموعات شفرات TLS)

SHA-384 وSHA-512/256

SHA-384 نسخة مُقلَّصة من SHA-512 تُنتج 384 بت — مفيد عندما تريد العمليات الداخلية 64 بت لـ SHA-512 لكنك تحتاج مخرجات أقصر. SHA-512/256 متغيِّر مُقلَّص آخر ينتج مخرجات 256 بت باستخدام الحساب الداخلي لـ SHA-512. SHA-512/256 مقاوم لهجمات إطالة الطول التي تؤثر على SHA-256، مما يجعله مفيداً في السياقات التي تشكِّل فيها إطالة الطول مصدر قلق (رغم أن HMAC يُخفف هذا في معظم السيناريوهات العملية).

SHA-3 — بنية مختلفة ومستقبلية

يستخدم SHA-3 (المعيار NIST FIPS 202، 2015) بناء الإسفنجة Keccak — تصميم مختلف جوهرياً عن بنية Merkle-Damgard الخاصة بـ SHA-2. هذا مهم لأن أي ضعف مستقبلي يُكتشف في تصميم Merkle-Damgard سيؤثر على MD5 وSHA-1 وSHA-2 في آنٍ واحد، بينما يظل SHA-3 غير متأثر.

SHA-3 آمن حالياً وهو الخيار الأنسب للأنظمة الجديدة التي تحتاج إلى ضمان طويل الأمد أو تريد التحوط من ضعف SHA-2 المستقبلي. إنه أبطأ من SHA-256 في تطبيقات البرمجيات النقية. يتألق SHA-3 في تطبيقات الأجهزة — تصميمه فعَّال جداً في الدوائر الإلكترونية. SHA-3-256 وSHA-3-512 ينتجان أحجام ملخصات مطابقة لنظيريهما في SHA-2.

جدول المقارنة

الخوارزمية المخرجات مقاومة التصادم الحالة السرعة (SW) لكلمات المرور؟
MD5 128 بت مكسور منتهي الصلاحية سريع جداً أبداً
SHA-1 160 بت مكسور منتهي الصلاحية سريع أبداً
SHA-256 256 بت 128 بت المعيار الحالي سريع (تسريع HW) أبداً (سريع جداً)
SHA-512 512 بت 256 بت آمن سريع على 64 بت أبداً (سريع جداً)
SHA-3-256 256 بت 128 بت مستقبلي متوسط (SW) أبداً (سريع جداً)
bcrypt 60 حرفاً لا ينطبق لكلمات المرور فقط بطيء عمداً نعم

تجزئة كلمات المرور: مشكلة مختلفة تماماً

يستحق هذا قسماً خاصاً لأنه أحد أكثر الأخطاء شيوعاً بين المطورين. SHA-256 الأداة المناسبة للتحقق من سلامة الملفات وتوقيع API والتحقق من الشهادات. لكنه الأداة الخاطئة لتجزئة كلمات المرور، واستخدامه لهذا الغرض يُسبِّب حوادث أمنية حقيقية.

المشكلة هي السرعة. صُمِّم SHA-256 ليكون سريعاً — يمكن لوحدة المعالجة الرسومية الحديثة حساب مليارات تجزئات SHA-256 في الثانية. مهاجم يحصل على قاعدة بيانات كلمات المرور المُجزَّأة يمكنه تجربة مليارات التخمينات في الثانية. حتى كلمة مرور طويلة وعشوائية يمكن اختراقها بسرعة إذا كانت التجزئة سريعة.

// NEVER do this for passwords
const hash = crypto.createHash('sha256').update(password).digest('hex');
// Use bcrypt, scrypt, or Argon2 for passwords
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash(password, 12);  // cost factor 12

تتيح أداة اختبار Bcrypt تجزئة والتحقق من كلمات مرور bcrypt في المتصفح. لفهم معاملات تكلفة bcrypt وأوقات حسابها، تُعد مرجعاً مفيداً عند إعداد معامل العمل لتطبيقك.

HMAC: إضافة المصادقة إلى التجزئة

التجزئة العادية لا تُثبت شيئاً عمَّن حسبها — يمكن لأي شخص يمتلك البيانات حساب تجزئة SHA-256 ذاتها. HMAC (رمز مصادقة الرسالة القائم على التجزئة) يُضيف مفتاحاً سرياً إلى الحساب، مُنتِجاً علامة لا يمكن إعادة إنتاجها إلا من يعرف المفتاح. HMAC-SHA256 هو المعيار لـ:

  • التحقق من توقيع Webhook (GitHub وStripe وShopify جميعها تستخدم HMAC-SHA256)
  • AWS Signature Version 4 (توقيع الطلبات)
  • رموز JWT HS256 (HMAC-SHA256 لرأس + الحمولة)
  • نزاهة ملفات تعريف الارتباط (توقيع ملفات تعريف ارتباط الجلسة لمنع التلاعب)
const crypto = require('crypto');

// Sign a message with HMAC-SHA256
const mac = crypto
  .createHmac('sha256', secretKey)
  .update(message)
  .digest('hex');

// Verify: compare in constant time (prevents timing attacks)
const isValid = crypto.timingSafeEqual(
  Buffer.from(mac, 'hex'),
  Buffer.from(received, 'hex')
);

لاحظ استخدام timingSafeEqual للمقارنة. مقارنة قيم MAC بفحص مساواة سلسلة عادي يُسرِّب معلومات توقيت قابلة للاستغلال في هجوم التوقيت. استخدم دائماً دالة مقارنة ثابتة الوقت عند التحقق من MACs. استخدم أداة مولِّد HMAC لحساب قيم HMAC-SHA256 للاختبار والتصحيح دون كتابة كود.

توصيات للعالم الحقيقي

سلامة الملفات العامة (مجاميع الفحص)

استخدم SHA-256. إنه معيار التحقق من الحزم (ملفات npm lockfiles وتجزئات pip requirements وطبقات Docker image). تحسب أداة تجزئة SHA-256 ملخصات SHA-256 في متصفحك لإدخالات النص أو القيم الحرفية. لمجاميع الفحص السريعة غير الأمنية حيث السرعة حاسمة وتثق بالمصدر، يظل MD5 مقبولاً، لكن SHA-256 مفضَّل في أي سياق مشترك أو آلي.

شهادات TLS وتوقيع الكود

SHA-256 هو المعيار المطلوب. جميع السلطات المصدِّقة تُصدر شهادات SHA-256. لا تستخدم MD5 أو SHA-1 لشهادات جديدة — ستُرفض من المتصفحات وأنظمة التشغيل الحديثة.

مصادقة API

استخدم HMAC-SHA256. إنه المعيار الراسخ والمدعوم جيداً في جميع اللغات والخوارزمية المتوقعة في معظم وثائق أمان API. احسب الملخصات بأداة تجزئة MD5 أو تجزئة SHA-256 للمقارنات السريعة، وأنشئ توقيعات HMAC بأداة مولِّد HMAC.

تجزئة كلمات المرور

استخدم bcrypt (معامل تكلفة 12 أو أعلى) أو scrypt أو Argon2id. لا تستخدم MD5 أو SHA-1 أو SHA-256 أو SHA-512 مباشرةً لكلمات المرور، حتى مع الإضافة العشوائية (salt). تُساعد أداة اختبار Bcrypt في التحقق من تجزئات bcrypt أثناء التطوير.

البيانات طويلة الأمد التي تتطلب أمان لعقود

فضِّل SHA-512 أو SHA-3-256. يوفر حجم الملخص الأكبر هامشاً إضافياً ضد التقدم في تحليل التشفير. يوصي NIST بـ SHA-512 وSHA-3 للتطبيقات التي تتطلب أمان طويل الأمد. راجع التوجيه الرسمي في NIST FIPS 180-4 للمواصفة الموثوقة لخوارزميات SHA-2.

الأنظمة الجديدة بدون قيود إرثية

SHA-256 للاستخدام العام. Argon2id لكلمات المرور. HMAC-SHA256 لرموز المصادقة. إذا أردت الأمان المستقبلي وتقبَّلت أداءً أقل قليلاً، SHA-3-256 بديل صلب لـ SHA-256 للتجزئة متعددة الأغراض.