PHP 有 password_verify 错误吗?

Does PHP have a password_verify bug?

以下代码片段不应发出 'MATCHED',因为密码 'testtest' 与 'testtesttest' 不匹配,但在 PHP 7.4.3 上对我有效。我做错了什么吗?

<?php
$sPass = 'testtesttest';
$sSalt = hash('sha256','this is my salt');
$sShadow = password_hash($sSalt . $sPass,PASSWORD_BCRYPT);
echo (password_verify($sSalt . 'testtest',$sShadow) ? 'MATCHED' : 'nomatch');

请注意,如果删除上面的 salt 引用,代码可以正常工作。这就像 PHP 的 password_hash 和 password_verify 函数有大小限制,如果字符串超过这么多字符,它们将不再准确。

所以,我认为这是一个错误。

BCrypt can only handle 72 characters,你的salt占用了64个字符,所以你的密码只考虑了8个字符。

The input to the bcrypt function is the password string (up to 72 bytes), a numeric cost, and a 16-byte (128-bit) salt value.

使用 salt 的二进制形式不要“浪费”那么多字符,或者根本不使用一个字符,因为 password_hash 无论如何都会生成一个字符。