2013-02-26 81 views
2

我有下面的代码片段返回false:`password_verify`呼吁正确的密码

// 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功能。

+0

不同的系统安装了不同的加密算法,所以他们可能会使用不同的算法。如果您没有指定可能发生的意外事件。在解密或比较之前,您必须首先检查使用了哪种类型的加密。 – arkascha 2013-02-26 13:40:37

+0

你使用什么PHP版本? (我假设为5.3或5.4,因为lib只适用于那些版本,但是你能指定你正在测试的每台机器上的确切版本吗?) – SDC 2013-02-26 13:42:36

+0

它在5.3.14上工作,而不是在5.2.17上工作 – Matthew 2013-02-26 14:08:04

回答

2

看来您正在PHP版本小于5.3.7的脚本上运行脚本,因此算法'2y'尚未知道。

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

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

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

...将其更改为前者BCrypt常量 '2A' ......

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

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

新生成的密码散列现在将以'$2a$10$...'开头,并且使用此散列值进行验证应该适用于每个系统。

+0

感谢你们,不幸的是,它不工作的服务器根本没有bcrypt,因为它运行的是PHP 5.2.17,并且只有5.3版本才开始有自己的bcrypt实现。 – Matthew 2013-02-26 14:22:42

+0

您是否尝试过利用http://phpseclib.sourceforge.net/ – 2013-02-26 14:31:50

+0

@Matt - 是的,那么您应该查看[phpass](http://www.openwall.com/phpass/)库,他们声称与PHP 3及更高版本一起工作,尽管他们可能会回退到不同的东西。 [Suhoshin-Pack](http://www.hardened-php.net/)也应该添加一个BCrypt的实现。当然,更新服务器将是一件好事。 – martinstoeckli 2013-02-26 14:40:52