php - `password_verify` 调用返回 false 以获得正确的密码

标签 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 计算的哈希长度为 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/

相关文章:

php - php中的字母转换

php - SELECT DISTINCT 有什么问题?

android - 生成 apk 后 key 散列无效以及如何为许多设备解决此问题?

c++ - 在c++中确定字符串中不同子字符串的数量并使用散列

javascript - Passport 登录可以,但密码错误只是超时

php - 基于其他表自动向mysql表添加列的方法

c# - 将 c# Rijndael 函数转换为 php 函数

Node.js 和密码安全 : three questions

Perl:将哈希数组转换为矩阵

node.js - 为什么我在运行 npm install 时在 bcrypt 中出现错误 404?