【问题标题】:Laravel - How do you use Hash::needsRehash()?Laravel - 你如何使用 Hash::needsRehash()?
【发布时间】:2015-10-16 02:23:45
【问题描述】:

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

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

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

如果您的数据库充满了另一种算法的哈希值并且Hash::needsRehash() 返回真,您将如何重新哈希用户密码以使其保持最新?您不能依赖“登录”密码,因为它需要先进行比较才能验证,对吧?

我想也许我想太多了,但我现在很困惑。幸运的是,我的用户密码无论如何都使用password_hash(),所以应该不是问题。

【问题讨论】:

    标签: php laravel authentication hash


    【解决方案1】:

    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 当且仅当散列算法已更改(因为您没有传递任何选项,例如成本)。

    至于如何以及何时使用它,您只有在拥有用户密码时才能重新散列 - 例如当他们登录时。因此,在登录过程中,您检查他们存储的密码算法是否与您当前的算法不同,如果是,则将其存储的密码哈希替换为新的。

    【讨论】:

    • 够清楚了。我的另一个担忧仍然存在。如果您当前的用户密码需要重新散列,如果您无法验证用户的真实密码,您将如何重新散列它们?
    • 我已经更新了我的答案;你是对的,除非你有密码,否则你不能重新设置密码。
    • 您始终可以验证用户的密码;当 PHP 存储密码时,它也会存储所使用的哈希值。因此 PHP 能够在哈希更改后验证密码。
    • 当前成本是否嵌入到哈希中?也就是说,我需要另一列来存储这个值,还是这一切都是自动处理的?
    • @Cruncher 当前成本嵌入在bcrypt 结果中。这个答案有一个很好的解释:stackoverflow.com/questions/6832445/…
    【解决方案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

    【讨论】:

      【解决方案3】:

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

      当用户登录时使用此方法,因为这是您唯一可以访问纯文本密码的时间。根据旧的hash确认无误后,取明文密码,重新hash,放回数据库以备后用。

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

      注意:显然使用md5()/sha512() 是个坏主意。我只是将它们用作示例。

      【讨论】:

        猜你喜欢
        • 2021-03-25
        • 1970-01-01
        • 1970-01-01
        • 2014-08-31
        • 2014-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-23
        相关资源
        最近更新 更多