我在写一篇 Password
类,而我使用的是 password_hash
与 PASSWORD_DEFAULT
来创建哈希值。
文档中说 password_hash
也可以返回 false
如果散列失败。在这种情况下,我就会抛出一个异常,我想仔细测试这种情况。
你有一个字符串的例子吗?$password
以致于 password_hash($spassword, PASSWORD_DEFAULT) === false
?
这跟 password_verify
回归 false
当它与哈希值不匹配时。
即使是很老的问题,但我也有非常相同的问题,并做了一个小小的depeer研究。所以我在这里分享我的稀疏结果。
password_hash
返回 null
". 当它不能处理东西的时候,就会出现这种情况。$options
-参数(如("cost" => -1
)什么的。但这是关于 null
,不 false
.false
既不与 PASSWORD_DEFAULT
,不与 PASSWORD_BCRYPT
在5.5、5.6和7.4中。password-hash
-函数)可能会返回false.https:/codeigniter.comuserguide3generalcompatibility_functions.html#password_hash)。false
-难以复述的案例(比如,当。这个 发生)。) 但是,即使是PHP开发者自己也没有测试那些所以我的印象是,它们只发生在非常特殊的情况下,当用于加密的底层c-libraries失败,并且不能用特殊的密码来触发。false
-案例当 在密码库的深处出现了空指针,例如. 我不是一个足够的C程序员,无法判断这是否可能,甚至不可能。但有 未验 对于 false
.false
-左箱虽然在文档中仍有说明。password_hash
在每一个错误的情况下都会抛出异常,就像你所期望的那样。结论: 我认为最好是抓住 false
的情况下 null
-情况下也是如此,尽管如果没有任何的 $options
提供的),愿它像它一样不可能。这也许是你的应用中最关键的部分! 特别是当使用 PASSWORD_DEFAULT
因为它可能会随着时间的推移而改变,因此它的行为,或者旧版本的PHP被允许用于你的应用程序。我会在这里抛出一个致命的错误,甚至是 die
出,因为据我所知, false
-只有在服务器严重配置错误的情况下才会发生。因此,它不能在单元测试中进行测试。
$hash = password_hash($password, PASSWORD_DEFAULT);
if (!$hash) {
trigger_error("Fatal error when encrypting the password", E_USER_ERROR);
}