我在PHP中遇到了password_verify
的奇怪问题。
我使用以下代码生成了密码哈希:
$key = bin2hex(openssl_random_pseudo_bytes(32));
$salt = bin2hex(openssl_random_pseudo_bytes(16));
$hash = password_hash($salt.$key, PASSWORD_BCRYPT, ['cost' => 11]);
输出以下值
Key = 89b19c3ea20e978f6c1d60de8e4ff9baadffa51c654388a40c0624c9c577196e
Salt = 3c84972f78ee4841897a49c5261d7dcc
Hash = $2y$11$MRvQIALTzOFK6QMYvaFul.q69ZFZmwzchedlgzwCy9caOeEgXGtpu
然后我有了验证密码的功能:
function authenticate($key, $salt, $hash)
{
if (! password_verify($salt.$key, $hash)) {
return 0;
}
return 1;
}
但是,以下所有内容似乎都会返回1
:
authenticate(
'89b19c3ea20e978f6c1d60de8e4ff9baadffa51c654388a40c0624c9c577196',
'3c84972f78ee4841897a49c5261d7dcc',
'$2y$11$MRvQIALTzOFK6QMYvaFul.q69ZFZmwzchedlgzwCy9caOeEgXGtpu'
); // Returns `1`
authenticate(
'89b19c3ea20e978f6c1d60de8e4ff9baadffa51c',
'3c84972f78ee4841897a49c5261d7dcc',
'$2y$11$MRvQIALTzOFK6QMYvaFul.q69ZFZmwzchedlgzwCy9caOeEgXGtpu'
); // Returns `1`
在我从正在尝试进行身份验证的密钥中删除足够的字符之前,身份验证似乎没有失败,此时此问题是89b19c3ea20e978f6c1d60de8e4ff9baadffa51
。
authenticate(
'89b19c3ea20e978f6c1d60de8e4ff9baadffa51',
'3c84972f78ee4841897a49c5261d7dcc',
'$2y$11$MRvQIALTzOFK6QMYvaFul.q69ZFZmwzchedlgzwCy9caOeEgXGtpu'
); // Returns `0`
为什么会这样?
旁注:我知道使用像这样的盐没有意义,因为password_hash会生成它自己的盐。我不是在问这个问题,如果你想要,你可以把它想象成一个大字符串。