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

我看到password_hash函数有一些不寻常的行为,也许我错了,但请检查一下:


$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?


慕村225694
浏览 76回答 1
1回答

幕布斯6054654

如果将false或更改null为空字符串,您还将看到生成的哈希值,前导字节返回相同的结果。您可以轻松测试前导空字节:$var = password_hash(null, PASSWORD_DEFAULT, ['cost' => 10]);var_dump($var);var_dump(password_verify("\0", $var));最终var_dump()结果bool(true)显示您确实使用密码中的前导空字节创建了哈希。这是预期的行为,password_hash()因为它只会在出现错误时返回 NULL。所以这确实不是问题,因为没有人在密码中使用 NULL 字节。只有当您尝试“推出自己的”加密技术并且您通常传递的字符串根本不是字符串时,它才会成为问题。即使您尝试在字符串中设置 NULL 字节,它实际上只是一个字符串:$hashed = password_hash('\0asdfghjkl', PASSWORD_DEFAULT, ['cost' => 10]);var_dump($hashed);var_dump(password_verify("\0", $hashed));从bool(false). password_verify()_底线除非您试图做一些棘手的事情,例如预先散列您的密码,否则您在这里发现的都是设计使然。没有人输入除字符串以外的任何内容作为密码(您可以仔细检查密码,但不要清理它们,以确保它是一个会被视为穿着吊带腰带的字符串),并且您永远不应该遇到输入 NULL 字节的情况。
打开App,查看更多内容
随时随地看视频慕课网APP