PHP password_verify验证不完整的密码?

时间:2018-01-04 16:33:19

标签: php passwords password-hash

我在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会生成它自己的盐。我不是在问这个问题,如果你想要,你可以把它想象成一个大字符串。

0 个答案:

没有答案