为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕村225694 2023-09-08 18:19:21
我看到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?
查看完整描述

1 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

如果将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 字节的情况。


查看完整回答
反对 回复 2023-09-08
  • 1 回答
  • 0 关注
  • 52 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信