什么时候需要使用password_needs_rehash()函数?

6

我有一个登录应用程序的处理文件。我不明白password_needs_rehash()的目的,或者它没有起作用。登录已经通过认证并将我传递到正确的页面。但是,我甚至不能使代码回显新哈希。

我是否做得正确?

if语句没有抛出新哈希,是因为密码不需要重新哈希吗?如果是这样,那么如果密码在DB中被正确地哈希和存储,什么时候需要重新哈希呢?

我的处理文件如下:

$hash = $row['hash'];
$userPassword = $_POST["li_password"];
if (password_verify($userPassword, $hash)) {
    if ( password_needs_rehash($hash, PASSWORD_DEFAULT, ['cost' => 12]) ) {
        $newhash = password_hash($userPassword, PASSWORD_DEFAULT, ['cost' => 12]);
        echo $newhash;
    }
} else {
    header('Location: http://' . $_SERVER['HTTP_HOST'] . '?error=loginfailed');
    exit();
}

2
如果您更改了“cost”,则需要重新散列。 - Xorifelse
我明白了。新手问题:为什么我想要改变成本?如果我这样做,那么一旦“用户”第一次登录,新哈希的成本被更改,它不会重新散列,对吗?或者我想要随机化成本? - theRyanMark
2
成本越高,将原始密码转换为可用于验证密码的哈希值所需的CPU时间就越长。成本越高,破解它就越困难。那么为什么要更改它呢?也许在CPU速度提高的时候,或者你转移到了云端,在那里多个CPU执行相同的任务并且负载得到平衡。无论哪种方式,10就足够了。 - Xorifelse
好的,所以这是一段未来可靠的代码?比如说两年后,CPU的速度变快了,意味着我设置的成本现在不太安全,那么我会提高成本以跟上时代的步伐? - theRyanMark
1
基本上是的。不需要更改代码或任何内容,只需在登录时验证是否需要重新散列并自行更改成本即可。 - Xorifelse
假设在新版本的PHP中PASSWORD_DEFAULT的值发生了变化,@Xorifelse也会受到影响。 - TRiG
1个回答

6

函数password_needs_rehash()只需要在更改$options时使用,这通常指的是cost

成本越高,哈希密码所需的CPU时间就越多,但破解它变得越困难。如果您更改托管或转移到基于云的系统,多台计算机可以为您计算哈希,您可以自行增加它。

仅需要在用户登录时检查密码是否需要重新哈希,因为如果您更改了$optionspassword_verify()仍然可以验证密码。如果此时password_needs_rehash()返回true,请使用新选项和替换旧哈希的password_hash()

if (password_verify($_POST["li_password"], $row['hash'])) {
    // valid login

    if (password_needs_rehash($row['hash'], PASSWORD_DEFAULT, $options = ['cost' => 12])) {
        $newhash = password_hash($_POST["li_password"], PASSWORD_DEFAULT, $options);
        // store new hash in db.
    }
} else {
    header('Location: http://' . $_SERVER['HTTP_HOST'] . '?error=loginfailed');
    exit();
}

你可能想确认一下我的答案,只是出于好奇心 - Your Common Sense
感谢您的编辑 @YourCommonSense,看来我一直忘记了 execute() 只接受值数组而不是从我的 API 中的 ...$packed 参数列表。是的,您的代码显然没有错误检查,看起来更加简洁。我只是添加了一些“意义”进去。 - Xorifelse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接