如何使用PHP验证htpasswd生成的bcrypt哈希?

问题描述

我必须验证使用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中的“简化”示例引入了另一个不同的问题(由于在命令行的哈希中转义了特殊字符),因此失败。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...