2

我有以下代码片段:

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

在一台服务器上它工作正常(哇哦!),在另一台服务器上它不起作用。我刚刚把它放在 codepad.org 上,它也在那里失败了。

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

我在 github 上使用ircmaxel 的 password_compat 库password_verify来实现仅限 PHP 5.5 的功能。

4

1 回答 1

2

您似乎在小于 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$...'并且使用此哈希值的验证应该适用于每个系统。

于 2013-02-26T14:10:55.873 回答