密码散列API查询

时间:2013-02-13 07:32:37

标签: php mysql hash bcrypt php-password-hash

所以我使用的是新的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."'"
    );
}

Here is where you can find all the functions.

2 个答案:

答案 0 :(得分: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

有意义的是测试数据库(存储)中的散列是否与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."'"
    );
}

如果您希望从PHP核心中的默认哈希算法更新中受益,请考虑继续使用PASSWORD_DEFAULT

答案 1 :(得分:3)

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