Laravel - 你如何使用Hash :: needsRehash()?

时间:2015-07-25 13:36:27

标签: php laravel authentication hash

我想知道如何使用Hash::needsRehash(),因为我正在努力查看文档的确切内容。

if (Hash::needsRehash($hashed)) {
    $hashed = Hash::make('plain-text');
}

究竟是什么导致Hash::needsRehash()返回true或false,如果散列密码在另一个散列(例如MD5,SHA1等)中,它是否返回true?

如果您的数据库在另一个算法中充满了哈希值并且Hash::needsRehash()返回true,那么您将如何重新设置用户密码以使其更新?你不能依赖"登录"密码,因为它需要先进行比较才能验证,对吧?

我想也许我会过度思考但我现在很困惑。幸运的是,我的用户密码仍在使用password_hash(),所以不应该成为问题。

3 个答案:

答案 0 :(得分:4)

Hash::needsReHash()只调用php的内置password_needs_rehash函数。文档中有用的评论是:

// Check if a newer hashing algorithm is available
// or the cost has changed
if (password_needs_rehash($hash, PASSWORD_DEFAULT, $options)) {

当且仅当散列算法发生变化时,Hash::needsReHash()才会返回false(因为您没有传递任何选项,例如成本)。

至于如何以及何时使用此功能,您只能在拥有密码时重新密码 - 例如当他们登录时。所以在登录过程中,你检查他们存储的密码的算法是否与你当前的算法不同,如果是,你用新的密码哈希替换他们存储的密码哈希。

答案 1 :(得分:2)

当更新PHP并添加新的/更好的默认算法或更改任何其他参数时,该方法返回true。这使您可以自动利用它而无需更新代码。

当用户登录时使用此方法,因为这是您唯一可以访问纯文本密码的时间。根据旧哈希确认它是正确的后,您可以使用纯文本密码,将其重新删除,然后将其放回数据库中以备将来使用。

对于一个假设的例子,我们现在说算法是md5() 10k次。在PHP7中,它被更新为sha512() 15k次。如果散列采用$count|$algo|$hash格式,则该方法可以判断散列何时过时。由于旧算法未被删除,您仍然可以在重新散列之前使用旧参数验证密码。

注意:显然使用md5() / sha512()是一个坏主意。我只是以它们为例。

答案 2 :(得分:2)

这似乎是Laravel 5.6中的操作方法

将其放在您的LoginController中:

protected function authenticated(Request $request, $user) {
    if (Hash::needsRehash($user->password)) {
        $user->password = Hash::make($request->password);
        $user->save();
    }
}

https://laravel.com/docs/5.6/hashing#basic-usage