BuildQuill
أدلة المقارنة10 دقيقة قراءة

MD5 أم SHA-1 أم SHA-256 أم SHA-512: أي دالة هاش تستخدم؟

مقارنة واضحة بين أشهر خوارزميات الهاش من حيث السرعة ومقاومة التصادم وبصمات الملفات وتخزين كلمات المرور والتوقيعات والاختيارات الأمنية العملية.

MD5 أم SHA-1 أم SHA-256 أم SHA-512: أي دالة هاش تستخدم؟

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

الخلاصة السريعة: لا تستخدم MD5 أو SHA-1 لأي شيء أمني جديد. استخدم SHA-256 أو SHA-512 للسلامة والتحقق والتوقيعات حسب الحاجة. أما كلمات المرور فليست مكانا لاستخدام hash سريع مباشر؛ استخدم Argon2 أو bcrypt أو scrypt أو PBKDF2 بإعدادات صحيحة.

لكن التفاصيل مهمة، لأن المشاريع الواقعية مليئة بحالات رمادية: checksum لملف، توقيع webhook، cache key، اكتشاف تكرار، نظام قديم، أو قاعدة بيانات فيها أعمدة MD5 منذ سنوات ولا يريد أحد فتح هذا الباب.

ما معنى Hash؟

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

مثلا SHA-256 للنص hello:

Text
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

الهاش ليس تشفيرا. لا يوجد "فك تشفير" للهاش. هو بصمة، وليس صندوقا مغلقا. إذا قال شخص "شفرنا كلمة المرور بـ MD5"، فالجملة غالبا تكشف مشكلتين: MD5 ليس تشفيرا، وMD5 لا يصلح لتخزين كلمات المرور.

MD5: سريع ومعروف لكنه مكسور أمنيا

MD5 ينتج 128 بت، وغالبا يعرض كـ 32 حرفا hex.

Text
5d41402abc4b2a76b9719d911017c592

كان MD5 شائعا جدا لأنه سريع وسهل ومدعوم في كل مكان تقريبا. لكنه مكسور من ناحية التصادمات. يمكن إنشاء مدخلين مختلفين لهما نفس MD5 في ظروف عملية. هذا يجعله غير مناسب للتوقيعات، الشهادات، التحقق من ملفات قد يغيرها مهاجم، أو أي تصميم أمني جديد.

يمكن أن ترى MD5 في أنظمة قديمة أو لاكتشاف التكرار داخل بيانات موثوقة. مثلا إذا كان لديك أرشيف داخلي وتريد مقارنة ملفات بسرعة، قد يظهر MD5 لأنه قديم وسريع. لكن يجب أن يكون واضحا أنه ليس حاجزا أمنيا.

لا تستخدم MD5 لكلمات المرور. سرعته تجعل تجربة ملايين أو مليارات التخمينات ممكنة بأدوات رخيصة نسبيا. حتى مع salt، MD5 ليس اختيارا حديثا لتخزين كلمات المرور.

استخدمه فقط للتوافق القديم أو لفهم قيم موجودة، وليس كقرار جديد.

SHA-1: كان بديلا أفضل، ولم يعد كذلك

SHA-1 ينتج 160 بت، ويظهر عادة كـ 40 حرفا hex.

Text
aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d

لسنوات كان SHA-1 بديلا أقوى من MD5. لكن هذا الزمن انتهى. هجمات التصادم على SHA-1 أصبحت عملية بما يكفي لأن المتصفحات والجهات الأمنية والأنظمة الكبيرة انتقلت عنه.

قد تجده في معرفات قديمة، مستودعات تاريخية، بروتوكولات قديمة، أو بيانات لا يكون فيها الأمان هو الهدف. لكن لا تستخدمه لتوقيع جديد، ولا للتحقق من ملف أمام مهاجم، ولا لكلمات المرور، ولا لشهادة أو عقد أمني.

التعامل العملي مع SHA-1 يشبه MD5: اقرأه عند الحاجة، ادعمه إذا أجبرك التوافق، وخطط للانتقال منه. لا تجعله اختيارا جديدا.

SHA-256: الاختيار الحديث الافتراضي

SHA-256 من عائلة SHA-2 وينتج 256 بت، أي 64 حرفا hex عادة. في معظم المشاريع الحديثة، إذا احتجت دالة hash عامة وآمنة، فالإجابة تبدأ من SHA-256.

استخدم SHA-256 في checksums للملفات، التحقق من السلامة، HMAC لتوقيع الرسائل، content addressing، وأي حالة تحتاج بصمة قوية ومنتشرة. أدوات كثيرة ومكتبات كثيرة تدعمه، والمراجعين الأمنيين يعرفونه.

لكن لا تنس: SHA-256 سريع. هذا جيد للملفات والتواقيع، لكنه سيئ لكلمات المرور إذا استخدمته مباشرة. كلمة مرور مخزنة كـ sha256(password) ليست تخزينا صحيحا. تحتاج خوارزمية مخصصة لكلمات المرور.

عند توقيع API أو webhook، استخدم HMAC-SHA-256 بدلا من اختراع صيغة مثل sha256(secret + body). HMAC موجود لأنه يعالج تفاصيل دمج السر مع الرسالة بطريقة آمنة.

SHA-512: قوي، أطول، ومفيد في سياقات معينة

SHA-512 ينتج 512 بت، أي 128 حرفا hex. هو أيضا من عائلة SHA-2 وقوي للاستخدامات الحديثة. أحيانا يكون أداؤه جيدا جدا على أنظمة 64-bit، لكنه يعطي نتيجة أطول.

استخدم SHA-512 عندما يطلبه النظام، أو عندما تكون لديك سياسة أمنية تفضله، أو عندما لا يزعجك طول النتيجة. لكن لا تفترض أن SHA-512 دائما "أفضل" عمليا من SHA-256 لكل شيء. SHA-256 قوي بما يكفي لمعظم احتياجات السلامة والتوقيع، وأقصر وأسهل في التخزين والعرض.

إذا كنت تضع الهاش في رابط، سجل، عمود قاعدة بيانات، أو واجهة للمستخدم، فالطول مهم. 128 حرفا ليست مشكلة كبيرة للآلة، لكنها مزعجة للعرض والمقارنة.

مقارنة مباشرة

الخوارزمية طول الناتج طول hex الحالة الأمنية الاستخدام اليوم
MD5 128 بت 32 مكسورة للتصادم توافق قديم فقط
SHA-1 160 بت 40 مكسورة للتصادم توافق قديم فقط
SHA-256 256 بت 64 قوية الافتراضي الحديث
SHA-512 512 بت 128 قوية خيار قوي بطول أكبر

هذا الجدول يكفي لمعظم القرارات. MD5 و SHA-1 في درج القديم. SHA-256 و SHA-512 في الاستخدام الحديث.

Checksum أم أمان؟

كلمة checksum تستخدم أحيانا لأي hash، لكن هناك فرق بين اكتشاف تلف عشوائي ومقاومة مهاجم.

إذا كنت تريد معرفة هل الملف تلف أثناء النقل، فكثير من الخوارزميات القديمة تكتشف ذلك. بت واحد يتغير وسيختلف MD5 غالبا. لكن إذا كان هناك مهاجم يستطيع صنع ملف خبيث بنفس الهاش، فأنت تحتاج مقاومة تصادم حديثة، وهنا لا يصلح MD5 ولا SHA-1.

لتحميلات عامة أو ملفات يمكن أن يبدلها شخص، انشر SHA-256 على الأقل. أما في أنظمة داخلية موثوقة لاكتشاف التكرار، فقد توجد اعتبارات أداء، لكن يجب أن تفهم الخطر.

كلمات المرور قصة مختلفة

لا تخزن كلمات المرور بـ MD5 أو SHA-1 أو SHA-256 أو SHA-512 مباشرة. لا يكفي أن تضيف salt بنفسك وتشعر أن الموضوع انتهى. دوال الهاش العامة مصممة لتكون سريعة، والمهاجم يحب السرعة.

استخدم Argon2id إن توفر. استخدم bcrypt عند الحاجة لدعم واسع. استخدم scrypt أو PBKDF2 حسب المنصة والمتطلبات. هذه الخوارزميات تضيف salt وتكلفة حسابية وربما تكلفة ذاكرة، وتجعل التخمين الجماعي أصعب بكثير.

القاعدة العملية: لا تبن نظام كلمات مرور بقطع صغيرة من عندك. استخدم مكتبة موثوقة، واضبط work factor، وخطط لإعادة الهاش عند تسجيل الدخول إذا تغيرت الإعدادات.

Hex و Base64 والبايتات الخام

ناتج الهاش في الأصل bytes. عندما تراه كنص، فهو غالبا مرمز. Hex شائع لأنه واضح: كل بايت يتحول إلى حرفين. Base64 أقصر، لكنه أقل وضوحا للعين. داخل الكود قد يكون الأفضل الاحتفاظ بالنتيجة كـ bytes حتى تحتاج عرضها أو نقلها.

إذا لم تتطابق قيمتان، لا تفترض فورا أن الخوارزمية مختلفة. ربما أحد الطرفين أضاف newline. ربما النص مشفر UTF-8 في مكان و UTF-16 في مكان آخر. ربما أحدهما يعرض Hex والآخر Base64. وربما تم hash للملف نفسه في طرف وللمسار أو النص في طرف آخر.

التوثيق الجيد يقول: ما الذي يتم عمل hash له بالضبط، بأي encoding، وكيف يعرض الناتج.

الهجرة من MD5 أو SHA-1

إذا لديك نظام قديم، لا تبدأ بتغيير عشوائي. حدد وظيفة الهاش: كلمة مرور؟ checksum؟ توقيع؟ معرف؟ ثم ضع خطة.

للقيم العامة، أضف حقلا جديدا مثل sha256_hash بجانب القديم. أو أضف بادئة تحدد الخوارزمية:

Text
sha256:2cf24dba5fb0a30e...

خلال فترة الانتقال، اقبل القديم والجديد عند الحاجة، لكن توقف عن توليد القديم. بعد اكتمال التوافق، أزل الدعم الضعيف.

لكلمات المرور، الهجرة الشائعة تحدث عند تسجيل الدخول. تحقق من الهاش القديم مرة، ثم أعد تخزين كلمة المرور بخوارزمية حديثة.

أسئلة مراجعة أمنية مفيدة

عندما ترى hash في مشروع، لا تسأل فقط "ما الخوارزمية؟". اسأل: من يستطيع اختيار المدخلات؟ ماذا يحدث لو وجد تصادم؟ هل الهاش يحمي من خطأ عشوائي أم من مهاجم؟ هل يوجد سر في العملية؟ هل يتم استخدام HMAC عند الحاجة؟ هل المقارنة تتم بطريقة آمنة؟ وهل الخوارزمية قابلة للتغيير لاحقا؟

هذه الأسئلة تكشف الفرق بين استخدام عادي واستخدام حساس. Hash لاسم ملف داخل cache ليس مثل hash لتوقيع طلب دفع. Hash لاكتشاف تكرار صور داخل نظام داخلي ليس مثل checksum منشور لملف تحميل عام. كلما زاد تأثير التصادم أو التلاعب، زادت الحاجة لاختيار حديث وتوثيق واضح.

انتبه أيضا لطريقة المقارنة. في التواقيع والرموز السرية، يفضل استخدام constant-time comparison عندما توفره اللغة أو المكتبة. المقارنات العادية قد تكشف معلومات صغيرة من خلال الوقت في بعض السياقات. قد لا يهم هذا في كل تطبيق، لكنه مهم في أنظمة التوقيع والمصادقة.

Versioning للهاش

من الذكاء أن تخزن اسم الخوارزمية مع القيمة، خصوصا إذا كانت البيانات ستعيش سنوات. بدلا من عمود غامض اسمه hash, استخدم hash_algorithm و hash_value، أو بادئة مثل:

Text
sha256:2cf24dba5fb0a30e...

هذا يجعل الترحيل أسهل. إذا أردت لاحقا الانتقال إلى خوارزمية أخرى، لا تحتاج تخمين نوع القيم القديمة. في كلمات المرور، كثير من مكتبات password hashing تفعل هذا تلقائيا وتخزن الخوارزمية والإعدادات داخل نفس السلسلة.

كذلك لا تقص الهاش بلا تفكير. أحيانا تستخدم الأنظمة جزءا قصيرا من hash كمعرف، وهذا قد يكون مقبولا للعرض أو cache داخلي، لكنه يقلل مقاومة التصادم. كلما قصرت القيمة، زادت فرصة التصادم. إذا كان التصادم مكلفا، استخدم طول digest كافيا أو تحقق بخطوة إضافية.

الهاش الجيد ليس فقط خوارزمية قوية. هو أيضا طريقة استخدام واضحة، وتمثيل ثابت، وخطة ترقية عندما تتغير المتطلبات.

كيف تختار؟

إذا كان الاستخدام لكلمات المرور، استخدم خوارزمية كلمات مرور، لا hash عام. إذا كان الاستخدام أمنيا جديدا، استخدم SHA-256 أو SHA-512 وربما HMAC. إذا كان الاستخدام توافقا قديما، استخدم المطلوب فقط ووثق السبب. إذا كان checksum عاما لملف، استخدم SHA-256. إذا كان طول النتيجة مهم، SHA-256 غالبا عملي أكثر من SHA-512.

اختبار عملي قبل الاعتماد

قبل أن تعتمد hash في تكامل جديد، أنشئ test vectors صغيرة. اكتب المدخل الأصلي، encoding المستخدم، الخوارزمية، والناتج المتوقع. ثم شغل نفس المثال في الطرفين. هذه الطريقة تكشف أخطاء newline وUTF-8 وHex/Base64 بسرعة. وإذا كان الهاش جزءا من توقيع، اختبر حالة فشل أيضا: غير حرفا واحدا في الرسالة وتأكد أن التحقق يرفضها. الاختبار الجيد لا يثبت فقط أن الحالة الصحيحة تعمل، بل يثبت أن العبث لا يمر بهدوء.

ولا تعتمد على مثال واحد فقط. جرب نصا فارغا، نصا عربيا، نصا يحتوي سطرا جديدا، وملفا صغيرا. هذه الحالات تكشف اختلافات encoding والمسافات التي لا تظهر بالعين. في التوقيعات، جرب أيضا ترتيب JSON مختلفا إذا كان النظام يوقع النص الخام. أحيانا المشكلة ليست في SHA-256 نفسه، بل في أن كل طرف يعمل hash لتمثيل مختلف من نفس البيانات.

الخلاصة

MD5 و SHA-1 لم يعودا اختيارات أمنية حديثة. SHA-256 هو الافتراضي العملي لمعظم الحالات. SHA-512 قوي ومفيد عندما يناسب السياق. أما كلمات المرور فلها عالمها الخاص وخوارزمياتها الخاصة.

الهاش يبدو سلسلة واحدة هادئة، لكن القرار خلفها مهم. اختر الخوارزمية حسب الخطر، لا حسب ما ظهر في أول نتيجة بحث أو في كود قديم من عشر سنوات.