PHP 5.5 password_ *函数重新散列

时间:2014-03-20 11:11:28

标签: php algorithm hash password-hash

我已使用PHP password_*函数

设置了密码哈希

1)password_hash($password, PASSWORD_BCRYPT, array("cost" => 11);

2)return password_verify($password, $hashedPassword)? true : false;

一切正常。

我还找到了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_ *做了raccomanded使用" salt"密码与否?

谢谢!

1 个答案:

答案 0 :(得分:1)

使用的算法及其成本嵌入在密码哈希中。这是第一封信:

$2y$10$abcdefg...123456789...
 |  |    |        |
 |  |    |        +- the password hash
 |  |    +- the salt
 |  +- the cost parameter
 +- the algorithm type

(另见https://stackoverflow.com/a/16736254/476

因此,在验证密码时,password_verify知道要使用的算法。

检查密码是否需要重新散列的用法是确认嵌入在散列中的算法和成本因子是否仍然与您要使用的算法和成本因子相同。如果它们不相同,则应使用新配置重新密码。

典型的用途是随着时间的推移,随着硬件变得更快并且可以以更高的成本处理散列,您将增加成本因素​​。这不会突然使您的旧密码失效,仍然会使用哈希中嵌入的旧设置来确认这些密码。但是,由于您在验证时碰巧有明文密码,因此您应该利用该机会使用较新的设置更新哈希值。