MD5 مقابل SHA-256 — لماذا يجب التوقف عن استخدام MD5
MD5 موجود في كل مكان. يُشحن مع كل لغة برمجة وكل قاعدة بيانات وكل SDK لمزودي الخدمات السحابية. يلجأ إليه المطورون بالعادة — إنه سريع وينتج سلسلة سداسية عشرية أنيقة مكوَّنة من 32 حرفاً والـ API فيه سطران من الكود. المشكلة: MD5 مكسور تشفيرياً منذ عام 2004، والهجمات أصبحت أسرع وأرخص منذ ذلك الحين.
هذا ليس نظرياً. الهجوم الإلكتروني على البنية التحتية الإيرانية عام 2012 — برمجية Flame — زوَّر شهادة توقيع كود مايكروسوفت باستغلال تصادم MD5. التقنية ذاتها التي أثبتها علماء التشفير الأكاديميون في ورقة بحثية أصبحت سلاحاً في التجسس الجيوسياسي. MD5 ليس ضعيفاً بقدر طفيف؛ إنه مُخترَق جوهرياً لأي تطبيق يمكن فيه للمهاجم اختيار المدخلات.
SHA-256، جزء من عائلة SHA-2 المُعيَّرة بواسطة NIST، لا تُعرَف له هجمات تصادم ويظل المعيار للنزاهة التشفيرية في 2026. يشرح هذا المقال بالضبط ما يعنيه الفرق، ومتى (نادراً) يكون MD5 مقبولاً، وكيفية الهجرة بأمان. يمكن حساب كلتا التجزئتين فوراً بأداة Toova MD5 وأداة Toova SHA-256.
كيف تعمل دوال التجزئة
دالة التجزئة التشفيرية تأخذ مدخلاً بأي طول وتُنتج مخرجاً ثابت الطول (الملخص) بهذه الخصائص:
- حتمية: المدخل ذاته ينتج دائماً المخرج ذاته.
- تأثير الانهيار الجليدي: تغيير بت واحد في المدخل يُغيِّر المخرج كلياً.
- مقاومة الصورة الأولية: بإعطاء تجزئة، من المستحيل حسابياً إيجاد المدخل.
- مقاومة التصادم: من المستحيل حسابياً إيجاد مدخلَيْن مختلفَيْن ينتجان التجزئة ذاتها.
تأثير الانهيار الجليدي هو سبب بدو MD5 وSHA-256 متشابهَيْن للوهلة الأولى:
MD5("The quick brown fox jumps over the lazy dog")
= 9e107d9d372bb6826bd81d3542a419d6
MD5("The quick brown fox jumps over the lazy cog")
= 1055d3e698d289f2af8663725127bd4b SHA-256("The quick brown fox jumps over the lazy dog")
= d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592
SHA-256("The quick brown fox jumps over the lazy cog")
= e4c4d8f3bf76b692de791a173e05321150f7a345b46484fe427f6acc7ecc81be حرف واحد تغيَّر في المدخل ("dog" → "cog")، ومع ذلك المخرج مختلف كلياً. هذه الخاصية تنطبق على كلتا الخوارزميتين. الفرق هو ما يحدث عندما يحاول مهاجم إيجاد تصادم عمداً.
MD5 — جدول زمني من الفشل (1996-2025)
صمَّم رون ريفست MD5 عام 1991 كبديل لـ MD4. بحلول عام 1996، كان هانز دوبرتين قد وجد تصادمات في دالة الضغط لـ MD5 — لا الخوارزمية الكاملة، لكنه تحذير بأن التصميم هش. بدأ مجتمع الأمن بالتوصية بالانتقال إلى SHA-1. تجاهلت معظم الأنظمة ذلك.
2004 — إثبات تصادمات كاملة
في أغسطس 2004، قدَّمت شياويون وانغ وهونغبو يو هجوم تصادم عملياً على MD5 في مؤتمر CRYPTO. تمكَّنا من توليد رسالتَيْن مختلفتَيْن بطول 1,024 بت بنفس تجزئة MD5 في أقل من ساعة على مجموعة حاسوبية. الضمان الجوهري لـ MD5 — مقاومة التصادم — انكسر.
بدأ NIST فوراً في إيقاف استخدام MD5 للاستخدام الفيدرالي. تبعته معظم إرشادات الصناعة. نشر MD5 في أنظمة الإنتاج الفعلية كاد لا يتغير.
2008 — شهادات CA مارقة
أثبتت مجموعة من الباحثين (سوتيروف وستيفنز وآخرون) أنهم يمكنهم إنشاء شهادة سلطة إصدار شهادات مارقة تثق بها جميع المتصفحات الكبرى. استغل الهجوم حقيقة أن عدة سلطات إصدار شهادات كانت لا تزال توقِّع شهادات بـ MD5. ولَّد الباحثون تصادماً بين طلب شهادة يبدو شرعياً وشهادة CA مُصمَّمة ذاتياً — ثم حصلوا على CA حقيقي لتوقيع الشرعية، منتجاً توقيعاً صالحاً أيضاً لشهادة CA المزيَّفة.
حجبت كل المتصفحات الكبرى فوراً الشهادات الموقَّعة بـ MD5. توقفت معظم سلطات الإصدار عن إصدارها. الدرس الرئيسي: نقاط الضعف التشفيرية تصبح قابلة للاستغلال لحظة يتحكم المهاجم في المدخل لدالة التجزئة.
2012 — برمجية Flame
زوَّرت برمجية Flame للتجسس الإلكتروني، المكتشَفة عام 2012 والمنسوبة لجهات دولية، شهادة Windows Update لمايكروسوفت باستخدام تصادم MD5 ببادئة مختارة. كان الهجوم أكثر تطوراً من عرض 2008: تمكَّن المهاجمون من صياغة حمولة خبيثة تتصادم مع شهادة مايكروسوفت الشرعية في ظروف يتعاون فيها البنية الإنشائية لتوقيع مايكروسوفت دون علمها.
النتيجة: تمكَّنت Flame من توزيع نفسها عبر Windows Update كأنها تحديث مايكروسوفت شرعي، بتوقيع مايكروسوفت صالح. أُصيبت مئات الآلاف من أجهزة Windows في إيران ولبنان وسوريا والسودان. كان هذا استغلالاً واقعياً لهجمات تصادم MD5 على نطاق الدول القومية. راجع مقالة ويكيبيديا عن برمجية Flame للتاريخ الكامل.
2019-2025 — HashClash والتصادمات الفورية
واصل مشروع HashClash (مارك ستيفنز، CWI Amsterdam) دفع توليد تصادمات MD5 إلى الحدود العملية. بحلول 2019، يمكن توليد تصادمات MD5 ببادئة مختارة — حيث يختار المهاجم بادئات اعتباطية لكلتا الرسالتين المتصادمتين — في أيام على أجهزة تجارية. بحلول 2022، قلَّلت التطبيقات المُحسَّنة هذا إلى ساعات. في 2024، أثبتت ورقة HashClash تصادمات في أقل من دقيقة على وحدة معالجة رسومية حديثة واحدة.
المسار واضح: هجمات تصادم MD5 لا تصعب مع تحسُّن الأجهزة — بل تصبح أسهل. ما احتاج لمجموعة حاسوبية في 2004 يحتاج لحاسوب محمول في 2026.
SHA-256 — لماذا يصمد
SHA-256 جزء من عائلة SHA-2، صمَّمه NSA ووضع NIST معياره عام 2001. ينتج ملخصاً بطول 256 بت (32 بايت). لا هجمات تصادم عملية ضد SHA-256 معروفة حتى 2026. أفضل الهجمات المنشورة تُقلِّل معامل العمل النظري لإيجاد التصادمات إلى ما يقارب 2^187 عملية — لا تزال بعيدة جداً عن أي مورد حوسبي موجود أو متوقع.
هامش أمان SHA-256 محافظ عمداً. حتى لو تحسَّنت الأجهزة بمعامل مليار (ما يقارب 30 مضاعفة بمعدل قانون مور)، يظل كسر SHA-256 مستحيلاً حسابياً. معامل العمل الفعلي لـ MD5 في التصادمات البالغ 2^18 إلى 2^23 كان في متناول أجهزة متواضعة عام 2004.
SHA-256 أيضاً أسرع مما قد تتوقع: تحتوي المعالجات الحديثة تعليمات SHA مخصصة (Intel SHA Extensions وARM Cryptography Extensions) تسمح للبرمجيات بحساب ملايين تجزئات SHA-256 في الثانية لكل نواة. إنه ليس أبطأ بشكل ملحوظ من MD5 لحالات الاستخدام النموذجية.
متى يكون MD5 مقبولاً (نادراً)
"مكسور" لا يعني "عديم الفائدة في كل غرض." MD5 يظل مقبولاً في السياقات التي:
- لا يوجد فيها مهاجم: اكتشاف تلف الملفات العرضي في نظام داخلي موثوق — لا التحقق من التنزيلات من الإنترنت، بل التحقق من اكتمال نسخة ملف بنجاح.
- السرعة أهم من الأمان: حساب مفاتيح التخزين المؤقت أو معرِّفات الأجزاء حيث يعني التصادم مجرد فقدان ذاكرة التخزين المؤقت، لا خرق أمني. نموذج المهاجم غائب.
- تطابق نظام خارجي موجود: بعض APIs القديمة لا تزال ترسل ETags أو مجاميع فحص MD5. يمكن قبول وحساب MD5 للتشغيل التفاعلي، طالما لا تستخدمه لقرارات أمنية.
- تقسيم جداول التجزئة: توزيع البيانات على حاويات بـ MD5 لمفتاح. التصادمات هنا تُسبِّب اختلالاً، لا فشلاً أمنياً.
القاسم المشترك: MD5 مقبول عندما لا يعتمد التطبيق على مقاومة التصادم ولا يوجد مهاجم يمكنه صياغة المدخلات. بمجرد كسر أي من الشرطين — وجود مهاجم، أو تصادم = فشل أمني — انتقل إلى SHA-256.
خرافات شائعة عن MD5
"MD5 مناسب إذا أضفنا salt"
الإضافة العشوائية (salt) تُغيِّر المدخل بحيث يحصل مستخدمان بكلمة المرور ذاتها على تجزئات مختلفة — تمنع هجمات جداول قوس قزح. لكنها لا تُصلح مشكلة التصادم. مهاجم بتجزئة MD5 المُضاف إليها salt لا يزال بإمكانه تطبيق القوة الغاشمة عليها بكفاءة لأن MD5 سريع: وحدات المعالجة الرسومية الحديثة تحسب ما بين 10-30 مليار تجزئة MD5 في الثانية. الـ salt يُضيف عملاً يتناسب مع فضاء البحث، لا مع صعوبة الخوارزمية.
لتجزئة كلمات المرور، لا MD5 ولا SHA-256 مناسبان بصرف النظر عن الإضافة العشوائية. استخدم bcrypt أو scrypt أو Argon2.
"MD5 مناسب لأننا نستخدمه داخلياً فقط"
الأنظمة الداخلية تُخترَق. نموذج التهديد "لا يمكن للمهاجم الوصول إلى مدخلاتنا" يميل للصمود حتى يكشف هجوم سلسلة التوريد أو تهديد داخلي أو تكوين خاطئ عن النظام. هجوم Flame حدث ضد أنظمة افترضت على الأرجح ثقة مماثلة في ضوابطها الداخلية.
"SHA-256 مبالغة — MD5 أسرع"
على الأجهزة الحديثة التي تحتوي تعليمات تسريع SHA، يكون SHA-256 أبطأ من MD5 بمقدار 2-5 مرات تقريباً. لمعظم التطبيقات — التحقق من سلامة الملفات وتوقيعات API ومفاتيح التخزين المؤقت — الفرق ميكرو ثوانٍ لكل عملية، غير ملحوظ في الممارسة. حجة الأداء لصالح MD5 على SHA-256 تنطبق فقط في سيناريوهات الإنتاجية العالية جداً حيث تهم حتى الميكرو ثوانٍ، وحتى في تلك الحالة عادةً ما تتوفر حلول أفضل من استخدام خوارزمية مكسورة.
دليل الهجرة — من MD5 إلى SHA-256
تجزئة كلمات المرور
// WRONG: MD5 for password hashing
const crypto = require('crypto');
const hash = crypto.createHash('md5').update(password).digest('hex');
// Crack time with modern GPU: seconds to minutes // WRONG: SHA-256 for password hashing (still too fast)
const crypto = require('crypto');
const hash = crypto.createHash('sha256').update(password).digest('hex');
// CORRECT: use bcrypt, scrypt, or Argon2 for passwords
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash(password, 12); هجرة تجزئات كلمات المرور المُخزَّنة تتطلب نهجاً تدريجياً. عند كل تسجيل دخول ناجح: تحقَّق من كلمة المرور مقابل تجزئة MD5 الموجودة، ثم أعِد التجزئة فوراً بـ bcrypt واستبدل القيمة المُخزَّنة. ضع علامة على كل حساب كمُهاجَر. بعد فترة معقولة (90 يوماً هو المعتاد)، أجبر على إعادة تعيين كلمة المرور لأي حسابات لا تزال تستخدم تجزئات MD5.
سلامة الملفات / مجاميع الفحص
# Linux: verify a file download
sha256sum -c ubuntu-24.04-desktop-amd64.iso.sha256
# macOS
shasum -a 256 ubuntu-24.04-desktop-amd64.iso
# Windows PowerShell
Get-FileHash ubuntu-24.04-desktop-amd64.iso -Algorithm SHA256 التحويل من MD5 إلى SHA-256 للتحقق من سلامة الملفات عادةً ما يكون بديلاً بسيطاً في الكود. نقطتا الحذر: (1) مجاميع الفحص الموجودة المُخزَّنة في قواعد البيانات أو الملفات تحتاج إعادة حساب وتحديث — لا اختصار لذلك؛ (2) APIs الخارجية أو أنظمة التخزين التي توفر ETags بـ MD5 (كبعض إعدادات S3) تتطلب تنسيقاً للتحويل.
HMAC لمصادقة API
// HMAC-SHA-256 for message authentication
const crypto = require('crypto');
const hmac = crypto.createHmac('sha256', process.env.SECRET_KEY)
.update(message)
.digest('hex'); إذا كنت تستخدم HMAC-MD5 لتوقيع طلبات API، انتقل إلى HMAC-SHA-256. بناء HMAC يُضيف مفتاحاً سرياً مما يُقيِّد بعض هجمات MD5، لكن HMAC-MD5 لديه ثغرات إطالة الطول والعنصر الأساسي لا يزال مُخترَقاً. المعايير الحديثة (JWT وAWS SigV4 وOAuth 2.0) جميعها تُحدِّد HMAC-SHA-256. يدعم مولِّد HMAC في Toova كلاً من HMAC-SHA-256 وHMAC-SHA-512 للاختبار.
التوقيعات الرقمية والشهادات
أي شهادة موقَّعة بـ MD5 يجب إعادة إصدارها فوراً — توقَّفت معظم سلطات الإصدار عن إصدار شهادات موقَّعة بـ MD5 بعد 2008، وترفضها جميع المتصفحات وأنظمة التشغيل الكبرى. للبنية التحتية PKI الداخلية، راجع إعداد CA الخاص بك وتأكد من أن SHA-256 هو الحد الأدنى لخوارزمية التوقيع المسموح بها. RSA-SHA256 أو ECDSA-SHA256 هي المعايير الحالية.
MD5 مقابل SHA-256 — مرجع سريع
| الخاصية | MD5 | SHA-256 |
|---|---|---|
| طول المخرج | 128 بت (32 حرفاً سداسي عشري) | 256 بت (64 حرفاً سداسي عشري) |
| مقاومة التصادم | مكسور (هجمات عملية) | آمن (لا هجمات معروفة) |
| تجزئة كلمات المرور | أبداً | لا (استخدم bcrypt/Argon2) |
| التوقيعات الرقمية | أبداً | نعم |
| سلامة الملفات (أمان) | أبداً | نعم |
| مجاميع فحص غير أمنية | مقبول (بدون مهاجم) | مناسب دائماً |
| مفاتيح التخزين المؤقت | مقبول | مناسب دائماً |
| توقيع شهادات TLS | مرفوض من المتصفحات | المعيار |
| متوافق مع FIPS 140-3 | لا (منتهي الصلاحية) | نعم |
الخلاصة
MD5 مكسور تشفيرياً منذ 2004. تصادمات البادئة المختارة — التقنية التي أعمل بها برمجية Flame — باتت رخيصة حسابياً. أي تطبيق يعتمد على MD5 للأمان (التوقيعات والتحقق من النزاهة والمصادقة) عرضة لهجمات تستغرق دقائق من الحوسبة لتنفيذها.
SHA-256 لا تُعرَف له هجمات عملية، ومُسرَّع برمجياً على المعالجات الحديثة، وهو معيار النزاهة التشفيرية عبر TLS وتوقيع الكود ومصادقة API. تكلفة الأداء مقارنةً بـ MD5 ضئيلة لتقريباً كل حالة استخدام.
مسار الهجرة مباشر: التحقق من سلامة الملفات هو بديل بسيط. توقيعات API تتطلب تنسيق ترقية إصدار. تجزئات كلمات المرور تحتاج استراتيجية إعادة تجزئة تدريجية عند تسجيل الدخول. لأي كود جديد، يجب أن يكون SHA-256 الخيار الافتراضي. احسب وقارن التجزئات مباشرةً بأداة Toova MD5 وأداة Toova SHA-256 — أو أنشئ رموز مصادقة HMAC-SHA-256 بأداة مولِّد HMAC.