问题描述
我必须验证使用PHP的htpasswd
(v7.4.3)由apache的password_verify
工具(v2.4.41)创建的bcrypt哈希。
但是如果我生成一个哈希值:
$ htpasswd -nbB test pass
test:$2y$05$m73wHlBS62EUh7uAxbUCJ.gHIfcEgiorl/1LrzNRAlSSH4bmrBUEy
...然后尝试在PHP中对其进行验证...
cat << EOF | php -a
if (password_verify('pass','$2y$05$m73wHlBS62EUh7uAxbUCJ.gHIfcEgiorl/1LrzNRAlSSH4bmrBUEy')) {
echo 'match';
} else {
echo 'mismatch';
}
EOF
... mismatch
已打印。但是,PHP可以验证自己的bcrypt哈希值...
cat << EOF | php -a
if (password_verify('test',password_hash('test',PASSWORD_BCRYPT))) {
echo 'match';
} else {
echo 'mismatch';
}
EOF
...这将打印match
。如何获得password_verify
来验证外部生成的bcrypt哈希?
解决方法
问题在于,在我的真实代码中,由于对.htpasswd
文件中的哈希值进行了不正确的解析,因此在哈希的末尾还有额外的空格。
OP中的“简化”示例引入了另一个不同的问题(由于在命令行的哈希中转义了特殊字符),因此失败。