【发布时间】:2017-05-12 06:51:57
【问题描述】:
我是 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
【问题讨论】:
-
这不是bug.... PHP只取密码字符串的前72个字符进行哈希和验证;这是limit of the bcrypt hashing algorithm
-
啊,好吧,我在文档中错过了你 - 所以如果我想使用任何类型的附加类型安全尾随“胡椒”,我必须将密码限制为 ~60,然后有一个最大值12chr 胡椒 - 除非,随机盐是否计入该限制?还是不包括在内?
-
在实践中无论如何都不需要胡椒;如果它的价值被发现一次,它不会让攻击者的生活变得更加困难。真正的安全性来自
password_hash自动添加的每个哈希的唯一盐。它使攻击哈希的复杂性比辣椒高出几个数量级。 -
这个 72 字节的限制是密码函数传递给 bcrypt 的胡椒/密码字符串的整个长度。其他算法可能有不同的限制,但目前密码功能只支持bcrypt
标签: php hash passwords password-protection verify