我想知道如何使用Hash::needsRehash()
,因为我正在努力查看文档的确切内容。
if (Hash::needsRehash($hashed)) {
$hashed = Hash::make('plain-text');
}
究竟是什么导致Hash::needsRehash()
返回true或false,如果散列密码在另一个散列(例如MD5,SHA1等)中,它是否返回true?
如果您的数据库在另一个算法中充满了哈希值并且Hash::needsRehash()
返回true,那么您将如何重新设置用户密码以使其更新?你不能依赖"登录"密码,因为它需要先进行比较才能验证,对吧?
我想也许我会过度思考但我现在很困惑。幸运的是,我的用户密码仍在使用password_hash()
,所以不应该成为问题。
答案 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)
将其放在您的LoginController中:
protected function authenticated(Request $request, $user) {
if (Hash::needsRehash($user->password)) {
$user->password = Hash::make($request->password);
$user->save();
}
}