我有以下代码片段:
// 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
计算的哈希长度为 13,而不是所需的 60。
我正在使用ircmaxel's password_compat library在 github 上实现仅 PHP 5.5 的 password_verify
功能。
最佳答案
看来您正在小于 5.3.7 的 PHP 版本上运行该脚本,因此算法“2y”尚不清楚。
如果可能的话,我会考虑在此服务器上进行 PHP 升级,'2y' 参数解决了 unicode 输入字符串的问题。
如果这不是一个选项,那么您可以替换兼容包中的算法。在第 49 行的某个地方你会发现...
$hash_format = sprintf("$2y$%02d$", $cost);
...将其更改为以前的 BCrypt 常量 '2a'...
$hash_format = sprintf("$2a$%02d$", $cost);
...这当然不是最佳的,但这是您在早期版本上可以做的最好的事情。
新生成的密码哈希现在将以 '$2a$10$...'
开头,并且使用此哈希值进行的验证应该适用于每个系统。
关于php - `password_verify` 调用返回 false 以获得正确的密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15090481/