我已经使用 PHP password_*
函数设置了我的密码散列
1) password_hash($password, PASSWORD_BCRYPT, array("cost"=> 11);
2) return password_verify($password, $hashedPassword)?真:假;
一切正常。
我还找到了 password_needs_rehash() 函数,它有 2 个参数,$hashedPassword 和算法,例如:
password_needs_rehash($hashedPassword, PASSWORD_BCRYPT);
我知道在更改算法或成本时使用它,例如:
if (!password_verify($password, $hashedPassword)) {
return false;
}
if (password_needs_rehash($hashedPassword, PASSWORD_BCRYPT)) {
$hashedPassword = password_hash($password, PASSWORD_BCRYPT);
// update user password in database with $hashedPassword
}
return true;
一切都很清楚,我只是有疑问。
我尝试更改成本,而不调用 password_needs_rehash() 函数,并且我能够登录。
我还尝试更改生成哈希的函数,我将算法从 PASSWORD_BCRYPT 更改为 PASSWORD_DEFAULT。
我总是能够登录。
谁能解释一下它是如何工作的?
如果我们在算法更改时不重新哈希,PHP password_* 将如何处理?
PS 一个小问题进问题... 使用 php function_* 是否需要使用“salt”作为密码?
谢谢!!
最佳答案
所使用的算法及其成本嵌入在密码哈希中。这是前几个字母:
$2y$10$abcdefg...123456789...
| | | |
| | | +- the password hash
| | +- the salt
| +- the cost parameter
+- the algorithm type
(另见 https://stackoverflow.com/a/16736254/476 )
因此,在验证密码时,password_verify
知道使用什么算法。
检查密码是否需要重新散列的用途是确认散列中嵌入的算法和成本因素是否仍然与您想要使用的相同。如果它们不相同,您应该使用新配置重新散列密码。
典型的用途是随着时间的推移,随着硬件变得更快并且可以处理成本更高的散列,您将增加成本因素。这不会突然使您的旧密码失效,这些密码仍将使用哈希中嵌入的旧设置进行确认。但是,由于您在验证时恰好手头有明文密码,因此您应该利用这个机会使用较新的设置更新哈希。
关于PHP 5.5 password_* 函数重新散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22531123/