شرح صفوف ومحتوى الفقرة
فور نجاح التحقق عبر 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";
}
}