انتقل إلى محتوى الدرس

Why MD5 and SHA256 Fail for Passwords لماذا تفشل MD5 و SHA256 في حماية كلمات المرور

خزّن كلمات مرور المستخدمين بأمان تام في PHP 8 باستخدام password_hash وخوارزميات Bcrypt وArgon2id ودالة التحقق password_verify.
1 صفوف تعليمية
PHP
0 مشاهدة

شرح صفوف ومحتوى الفقرة

الصف 1 شرح توضيحي

صُممت دوال التجزئة العامة مثل md5() وsha1() وhash("sha256", ...) لتكون فائقة السرعة، مما يجعلها كارثية وغير صالحة إطلاقاً لتخزين كلمات مرور المستخدمين.

  • تستطيع البطاقات الرسومية الحديثة حساب مليارات التجزئات من نوع MD5 أو SHA-256 في الثانية الواحدة، مما يكسر كلمات المرور خلال ثوانٍ.
  • تُنتج كلمات المرور المتطابقة نفس بصمة MD5 أو SHA-256 عند غياب الملح الفريد، مما يجعلها عرضة لجداول القيم المحسوبة مسبقاً (Rainbow Tables).
  • يتطلب تخزين كلمات المرور خوارزميات بطيئة عمداً وقابلة لزيادة عامل التكلفة مع توليد ملح تشفيري عشوائي فريد لكل كلمة مرور.

بينما تنتهي دالة hash("sha256", ...) في أجزاء من النانو ثانية بدون ملح، تطبق دالة password_hash() عامل تكلفة متكيفاً وتدمج ملحاً عشوائياً فريداً داخل النص الناتج.

مخطط توضيحي: محاكي تجزئة كلمات المرور والتحقق منها في PHP 8.4
PHP
<?php
$plain = "Summer2026!";

// INSECURE: Fast deterministic digest (same input = same output)
$fastSha = hash('sha256', $plain);

// SECURE: Slow adaptive hash with unique random salt
$secureHash = password_hash($plain, PASSWORD_DEFAULT);

echo "SHA-256 len : " . strlen($fastSha) . "\n";
echo "Prefix      : " . substr($secureHash, 0, 7) . "\n";