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

Upgrading Hashes with password_needs_rehash ترقية التشفير تلقائياً بـ password_needs_rehash

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

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

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

فور نجاح التحقق عبر password_verify() أثناء تسجيل الدخول، استدعِ دالة password_needs_rehash() لفحص ما إذا كانت التجزئة المخزنة تستخدم تكلفة قديمة تحتاج للترقية.

  • تُعد لحظة تسجيل الدخول الناجح الفرصة الوحيدة التي يمتلك فيها الخادم كلمة المرور الصحيحة مؤقتاً في الذاكرة.
  • إذا أرجعت password_needs_rehash($storedHash, PASSWORD_DEFAULT, ["cost" => 12]) القيمة true، ولّد تجزئة جديدة وحدّث سجل المستخدم بـ PDO.
  • تتيح هذه الآلية ترقية تشفير حسابات المستخدمين تدريجياً دون إجبارهم على إعادة تعيين كلمات المرور.

لأن $legacyHash أُنشئت بتكلفة 10، تكتشف دالة password_needs_rehash() اختلافها عن التكلفة المطلوبة 12 وتنفذ الترقية فوراً.

PHP
<?php
$legacyHash = password_hash("Pass#2026", PASSWORD_BCRYPT, ['cost' => 10]);
$input = "Pass#2026";

if (password_verify($input, $legacyHash)) {
    if (password_needs_rehash($legacyHash, PASSWORD_BCRYPT, ['cost' => 12])) {
        $newHash = password_hash($input, PASSWORD_BCRYPT, ['cost' => 12]);
        echo "Upgraded to cost 12: " . substr($newHash, 0, 7) . "\n";
    }
}