所以我使用的是新的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."'"
);
}
答案 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
参数,则每次都会生成随机盐,您应该得到不同的结果。你不应该提供静态盐。这意味着所有用户都具有相同的盐,这大大降低了其有效性。每个哈希需要应该有一个随机盐。