PHP password_hash()显示了一些异常行为?也许我';我错了?

PHP password_hash()显示了一些异常行为?也许我';我错了?,php,password-hash,Php,Password Hash,我看到了密码\u散列函数的一些异常行为,也许我错了,但请检查以下内容: $var = password_hash(false, PASSWORD_DEFAULT, ['cost' => 10]); $var = password_hash(null, PASSWORD_DEFAULT, ['cost' => 10]); var_dump($var); 它返回哈希字符串,如下所示: string(60) "$2y$10$MCkQPQcCxL5.ERZ5pJRA.en/Mol

我看到了密码\u散列函数的一些异常行为,也许我错了,但请检查以下内容:

$var = password_hash(false, PASSWORD_DEFAULT, ['cost' => 10]);
$var = password_hash(null, PASSWORD_DEFAULT, ['cost' => 10]);
var_dump($var);
它返回哈希字符串,如下所示:

string(60) "$2y$10$MCkQPQcCxL5.ERZ5pJRA.en/MolCwd015OcqNk2zh.ajpicLxONge"
在我看来,它应该只返回false?

基于此,您可以看到密码中允许使用false和NULL值,并将生成哈希。如果您将
false
null
更改为空字符串,您还将看到前导字节返回相同结果时生成的哈希。您可以轻松测试前导空字节:

$var = password_hash(null, PASSWORD_DEFAULT, ['cost' => 10]);
var_dump($var);

var_dump(password_verify("\0", $var));
最后的
var\u dump()
生成
bool(true)
显示您确实使用密码中的前导空字节创建了一个哈希。这是
password\u hash()
的预期行为,因为它只会

所以这真的不是问题,因为没有人在密码中使用空字节。只有当您尝试“滚动您自己的”加密并且通常传递的字符串根本不是字符串时,这才成为一个问题

即使尝试在字符串中设置空字节,它实际上也只是一个字符串:

$hashed = password_hash('\0asdfghjkl', PASSWORD_DEFAULT, ['cost' => 10]);
var_dump($hashed);

var_dump(password_verify("\0", $hashed));
密码验证()
返回
bool(false)

底线


除非您试图做一些棘手的事情,比如对密码进行预哈希,否则您在这里发现的都是经过设计的。除了字符串之外,任何人都不能输入任何东西作为密码(您只需再次检查密码,以确保它是一个可以被视为带吊带的字符串),并且您永远不应该遇到输入空字节的情况。

为什么?false和null可能会自动转换为一个空字符串,并且可以对空字符串进行哈希处理。(例如,
d41d8cd98f00b204e9800998ecf8427e
将是空字符串的md5。)缺少的返回值将比散列的空字符串具有更多的安全含义。因为您不需要在数据库中存储空值。IMHO,当你把它传递给PASSWORDHASH()时,你的任务是确保它正确。如果答案解决了你的问题,考虑接受答案。下面是如何返回此处并对勾号/复选标记执行相同操作,直到其变为绿色。这将通知社区,找到了解决方案。否则,其他人可能会认为问题仍然悬而未决,并可能希望发布(更多)答案。您将获得积分,并鼓励其他人帮助您。欢迎来到Stack
因为除了想破坏您登录的人之外,没有人在密码中使用空字节没错@Martin;-)这就是为什么我总是带着吊带!