`password_verify`调用返回false以获取正确的密码

时间:2013-02-26 13:35:40

标签: php hash bcrypt crypt

我有以下代码片段:

// bcrypt hash of 'password'
$hash = '$2y$10$4u0cQ.WEnwHDo.C5Nl1vm.shKA0beQ32wqzphSfzklAq9OcDM2nLu';
if(password_verify('password', $hash)) {
    print_r('woohoo!');
}
else {
    print_r('fubar');
}

在一台服务器上工作正常(哇哦!),在另一台服务器上工作不正常。 I've just put it up on codepad.org它也失败了。

问题是(可以在该键盘页面上看到)crypt计算的哈希长度为1​​3而不是所需的60。

我在github上使用ircmaxel's password_compat library来实现仅PHP {5.5} password_verify函数。

1 个答案:

答案 0 :(得分:2)

您似乎在小于5.3.7的PHP版本上运行脚本,因此尚不知道算法'2y'。

如果可能,我会考虑在这台服务器上进行PHP升级,'2y'参数解决了unicode输入字符串的问题。

如果这不是一个选项,那么您可以替换兼容包中的算法。关于第49行的某处你会发现...

$hash_format = sprintf("$2y$%02d$", $cost);

......将其改为前BC-'s常数'2a'......

$hash_format = sprintf("$2a$%02d$", $cost);

...这当然不是最佳选择,但它是您在早期版本中可以做到的最佳选择。

新生成的密码哈希现在将以'$2a$10$...'开头,具有此哈希值的验证应该适用于每个系统。