2015-11-25 95 views
0

我测试了PHP的password_verify,验证不正确。我使用的是centOS和PHP版本5.3.3。我知道5.3.3版本的PHP不提供password_hash函数,所以我已经使用了https://github.com/ircmaxell/password_compatPHP的BCrypt无法验证密码

但是,当我验证它时总是用不同的密码返回true。我的代码有bug吗?

这里是我的代码:

$password = 'k32AlGOPqvCzoh*Sp(Hdrr26]M=lQb00R&W=hew|-|([(03vp==A8%m?l=eA2^bs_|\qVV3WZ'; 

    $verify_pw = 'k32AlGOPqvCzoh*Sp(Hdrr26]M=lQb00R&W=hew|-|([(03vp==A8%m?l=eA2^bs_|\qVV3WZasdasdasdasdqweqa13123'; 

    $options = array(
       'cost' => 15 
      ); 

    $hash = password_hash($password, PASSWORD_BCRYPT,$options); 

    var_dump(password_verify($verify_pw ,$hash)); // always true 
+0

我不认为你会在password_verify()中发现很多随机数,但如果你真的相信代码中存在错误,那么你就创建一个[SSCCE](http://sscce.org/)来证明你的断言并在[github的兼容包](https://github.com/ircmaxell/password_compat/issues)上发布一个问题,或者关于[bugs.php.net](https://bugs.php)的错误报告.net /) –

+0

但它真的发生在我身上,那是我非常难过的。我知道'password_verify()'应该可以正常工作,但仍然无法弄清楚在我的关卡中会发生什么事情。或者我应该提供更多信息。 –

+0

bcrypt by design * always *给出不同的散列输出,看看[这个sof问题](http://stackoverflow.com/questions/8467819/bcrypt-generates-different-hashes-for-the-same-input)。或者只是尝试[这个加密计算器](https://www.dailycred.com/article/bcrypt-calculator)。但是,我想知道您的不同密码是指不同的纯文本还是传递到bcrypt并吐出不同输出的纯文本 - 请验证。另外,请注意您的哈希中的几个第一个字符,它定义了哈希长度和盐分,[wiki](https://en.wikipedia.org/wiki/Bcrypt)解释了这一点。 –

回答

2

问题不在于你的代码。例如Bcrypt具有来自56个字节的字符串限制,例如, 55个字符

https://www.usenix.org/legacy/events/usenix99/provos/provos_html/node4.html

关键参数是一个秘密的加密密钥,其可以是最多56个字节(包括终止零 字节 用户选择的密码时,关键是一个ASCII串)。

所以你的字符串被截断,这就是为什么你password_verify回报八方通true截短字符串相同的原因。

+0

非常感谢您,因此我需要限制用户字符长度或使用SHA-512随机发言。我对吗? –

+0

该算法在内部更好地管理字符,因此您至少可以使用“71”字符。我不知道SHA-512是否有类似的行为 – ins0

+0

SHA-512应该这样做,它会对字符串进行摘要。 –