Php Laravel-如何使用Hash::needsReshash()?

Php Laravel-如何使用Hash::needsReshash()?,php,laravel,authentication,hash,Php,Laravel,Authentication,Hash,我想知道如何使用Hash::needsReshash(),因为我很难看出使用文档到底是为了什么 if (Hash::needsRehash($hashed)) { $hashed = Hash::make('plain-text'); } 究竟是什么原因导致Hash::needsReshash()返回true或false,如果哈希密码位于另一个哈希中(如MD5、SHA1等),是否返回true 如果您的数据库中满是另一种算法中的哈希,并且Hash::needsReshash()返回tru

我想知道如何使用
Hash::needsReshash()
,因为我很难看出使用文档到底是为了什么

if (Hash::needsRehash($hashed)) {
    $hashed = Hash::make('plain-text');
}
究竟是什么原因导致
Hash::needsReshash()
返回true或false,如果哈希密码位于另一个哈希中(如MD5、SHA1等),是否返回true

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

我想也许我想得太多了,但我现在很困惑。幸运的是,我的用户密码使用的是
password\u hash()
,所以应该不会有问题。

hash::needsReHash()
只调用php的内置函数。文档中的有用注释如下:

// Check if a newer hashing algorithm is available
// or the cost has changed
if (password_needs_rehash($hash, PASSWORD_DEFAULT, $options)) {
因此,
Hash::needsReHash()
将在且仅当哈希算法已更改时返回false(因为您没有传递任何选项,如cost)


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

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

当用户登录时使用此方法,因为这是您唯一可以访问纯文本密码的时间。在根据旧的散列确认它是正确的之后,您获取纯文本密码,将其重新散列,并将其放回数据库以备将来使用

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

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

这似乎是在Laravel 5.6中实现的方法 将此文件放入您的LoginController:

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

足够清晰。我的另一个担忧仍然存在。如果您当前的用户密码需要重新设置,如果您无法验证用户的真实密码,您将如何重新设置它们?我已更新了我的答案;你是对的,除非你有密码,否则你不能重新设置密码;当PHP存储密码时,它还存储所使用的哈希。因此,PHP即使在哈希更改后也能够验证密码。当前的成本是否嵌入到哈希中?也就是说,我是否需要另一列来存储此值,或者这一切都是自动处理的?@Cruncher当前成本嵌入到
bcrypt
结果中。这个答案有很好的解释: