有一个非常具体的用例在这里还没有提到,那就是你已经迈出了第一步,开始使用crypt
函数,但仍然使用 MD5 算法。
在这种情况下,您在注册/密码更改时的密码哈希将如下所示:
$pass_hash = crypt($pass, '$1$salthere');
// store $pass_hash in database
然后你会比较:
if(hash_equals($pass_hash_from_db, crypt($user_input, '$1$salthere')))
{
// user logged in
}
这种转变的美妙之处在于您的数据库已经处于可以使用的状态password_verify
。
注册/密码更改将变为:
$pass_hash = password_hash($pass);
// store $pass_hash in database
您可以将比较替换为:
if(password_verify($user_input, $pass_hash_from_db))
{
// user logged in
}
这将开箱即用,并在下次更改密码时升级所有用户的密码。但是我们不需要等待,也可以按照@Fabian 在这里的回答中所做的事情来做。
这里我们只需要更改登录名:
if(password_verify($user_input, $pass_hash_from_db))
{
// user logged in
if(password_needs_rehash($pass_hash_from_db, PASSWORD_DEFAULT))
{
$pass_hash = password_hash($user_input);
// store $pass_hash in database
}
}
一旦新密码算法成为 PHP 的默认算法,这将为升级用户密码提供额外的好处。你实际上什么都不用做。
如果您希望为密码哈希函数使用其他参数(例如更改“成本”),您应该查看password_hash和password_needs_rehash文档,注意可选的最后一个参数$options
。