我对 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 个字符。对于密码来说,这已经足够了,不是安全问题,但在你的情况下,你似乎达到了这个限制,因为你想添加胡椒。
绝不应该因为添加胡椒粉而截断密码。辣椒 jar 头increase security of weak passwords 。假设胡椒的大小合理,达到限制的密码非常强,并且对于这些密码,胡椒是不必要的。所以如果你把胡椒放在最后,你就失去了一部分胡椒,这比失去一部分密码要好。
也就是说,有更好的方法来添加胡椒。使用服务器端 key 加密(双向)哈希可以获得相同的好处。该 key 实际上类似于胡椒,但您的优点是,只要有必要,您就可以交换 key (胡椒成为密码的一部分,并且在下次登录之前无法更改)。我试图在关于 safely storing passwords 的教程末尾解释这一点。 。如果加密不适合您,那么至少使用 HMAC 将胡椒与密码结合起来。
关于PHP的password_hash和password_verify误报错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43931128/