PHP password_hash和password_verify错误误报?

时间:2017-05-12 06:51:57

标签: php hash passwords password-protection verify

我是PHP密码函数的新手,但这对我来说似乎不对。

<?php
$peppa = "ahsd88ah31qnaksdn9325h9asdgh3no1i3859173o5bnn789a79on352390sfm!89235n@n90a&*^T#&*$#$!*$#)";
$pw = 'jesustake-thewheel';
$peppered = $pw . $peppa;

$passhash = password_hash($peppered, PASSWORD_BCRYPT);
var_dump($passhash);

echo "<br>";

$should_fail = $pw . $peppa . ".1asd223";
echo password_verify($should_fail, $passhash);

?>

正如你所看到我在针对密码的should_fail测试结束时添加了一些额外的随机字符,但它仍然为匹配返回True

我会因为最后还有其他字符与原来不匹配而错过这个...我在这里遗漏了一些明显的东西,或者这是php中的一个错误(可能是我的php)

版本15.6.30

1 个答案:

答案 0 :(得分:2)

正如MarkBaker在评论中已经提到的,这是BCrypt算法的一个限制,它将密码截断为72个字符。对于密码来说,这已经足够了,而不是安全问题,但是在你的情况下,你似乎达到了这个限制,因为你想添加辣椒。

由于添加辣椒,密码永远不会被截断。辣椒可以increase security of weak passwords。假设胡椒的大小合理,达到限制的密码非常强,对于那些密码,胡椒不是必需的。因此,如果你把辣椒放在最后,你会丢掉一部分辣椒,这比丢失一部分密码要好。

也就是说,有更好的方法来添加辣椒。通过使用服务器端密钥加密(双向)哈希,您可以获得相同的好处。这个键实际上类似于胡椒,但你有一个优点,你可以在必要时交换密钥(胡椒成为密码的一部分,直到下次登录才能更改)。我试着在关于safely storing passwords的教程结尾处解释这个问题。如果加密不是您的选择,那么至少使用HMAC将胡椒与密码结合起来。