PHP password_hash 和 password_verify 不正确的误报?
PHP password_hash and password_verify incorrect false positive?
我是 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
正如 MarkBaker 在他的评论中提到的,这是 BCrypt 算法的一个限制,它将密码截断为 72 个字符。对于密码来说,这已经足够了,不是安全问题,但在你的情况下,你似乎达到了这个限制,因为你想加点胡椒粉。
永远不要因为加了胡椒粉而截断密码。一个辣椒罐increase security of weak passwords。假设胡椒的大小合理,达到限制的密码非常强,并且对于这些密码不需要胡椒。所以如果把花椒放在最后,就少了一部分花椒,总比少了一部分密码好。
也就是说,添加胡椒粉的方法要好得多。使用服务器端密钥加密(双向)哈希可以获得相同的好处。该密钥实际上类似于胡椒粉,但您的优势在于可以在必要时交换密钥(胡椒粉成为密码的一部分并且在下次登录之前无法更改)。我试图在关于 safely storing passwords 的教程末尾解释这一点。如果加密不是您的选择,那么至少使用 HMAC 将胡椒粉与密码结合起来。
我是 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
正如 MarkBaker 在他的评论中提到的,这是 BCrypt 算法的一个限制,它将密码截断为 72 个字符。对于密码来说,这已经足够了,不是安全问题,但在你的情况下,你似乎达到了这个限制,因为你想加点胡椒粉。
永远不要因为加了胡椒粉而截断密码。一个辣椒罐increase security of weak passwords。假设胡椒的大小合理,达到限制的密码非常强,并且对于这些密码不需要胡椒。所以如果把花椒放在最后,就少了一部分花椒,总比少了一部分密码好。
也就是说,添加胡椒粉的方法要好得多。使用服务器端密钥加密(双向)哈希可以获得相同的好处。该密钥实际上类似于胡椒粉,但您的优势在于可以在必要时交换密钥(胡椒粉成为密码的一部分并且在下次登录之前无法更改)。我试图在关于 safely storing passwords 的教程末尾解释这一点。如果加密不是您的选择,那么至少使用 HMAC 将胡椒粉与密码结合起来。