7

所以我正在使用新的 PHP 5.5 Password Hashing API,但我不确定我是否正确理解了这一点。

我试过自动重新散列每次登录,有时我失败了,即使散列结果是一样的,我觉得我做错了什么。

这可能是我可能弄错了查询函数,因为当我检查 phpMyAdmin 时哈希甚至没有改变。

if (password_needs_rehash($result_row->user_password_hash, PASSWORD_DEFAULT))
{
    $newhash = password_hash(
        $_POST['user_password'], PASSWORD_BCRYPT, 
        ['cost' => 12, 'salt' => 'superfreakingsonicdude',]
    );

    // update hash in database
    $this->connection->query(
        "UPDATE users SET user_password_hash='" . $newhash .  
        "' WHERE user_name='".$result_row->user_name."'"
    );
}

在这里您可以找到所有功能。

4

2 回答 2

4

password_needs_rehash已引入该功能以检查您是否需要升级:

password_needs_rehash($result_row->user_password_hash, PASSWORD_DEFAULT)

此函数检查提供的哈希是否实现了提供的算法和选项。如果不是,则假定需要重新散列散列。

如果您在理解此函数的作用时遇到问题,请参阅 RFC 包含 PHP 代码中的函数。因此,如果您可以阅读 PHP 代码,您应该能够阅读以下内容(请参阅介绍的部分,因为它可以通过以下方式在用户域中实现:):https ://wiki.php.net/rfc/password_hash#password_needs_rehash

测试数据库(存储)中的哈希是否与 in 具有相同的算法是有意义的PASSWORD_DEFAULT。这意味着检查在PASSWORD_DEFAULT上次存储哈希值和现在之间是否已更改。

现在PASSWORD_DEFAULT PASSWORD_BCRYPT这样,它应该总是返回 false。在您的情况下,它返回 true,因为您在没有密码选项的情况下进行测试。

改变它,你应该没问题:

$options = ['cost' => 12, 'salt' => 'superfreakingsonicdude',];
########

if (password_needs_rehash($result_row->user_password_hash, PASSWORD_DEFAULT, $options))
                                                                             ########
{
    $newhash = password_hash($_POST['user_password'], PASSWORD_DEFAULT, $options);
                                                      ################  ########

    // update hash in database
    $this->connection->query(
        "UPDATE users SET user_password_hash='" . $newhash .
            "' WHERE user_name='".$result_row->user_name."'"
    );
}

PASSWORD_DEFAULT如果您想从 PHP 核心中的默认散列算法更新中受益,也可以考虑继续使用。

于 2013-02-13T08:14:20.117 回答
3

哈希的输入是密码和盐。相同的密码,相同的盐,相同的结果。
如果你不考虑这个salt参数,每次都会生成一个随机盐,你应该得到不同的结果。您不应该提供静态盐。这意味着所有用户都有相同的盐,这大大降低了它的有效性。每个单独的哈希需求都应该有一个随机盐。

于 2013-02-13T08:04:57.470 回答