密码哈希API查询


Password Hashing API Query

所以我正在使用新的PHP 5.5密码哈希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."'"
    );
}

在这里你可以找到所有的函数。

函数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_DEFAULTPASSWORD_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

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