我正在撰写Password
课程,并且我使用password_hash
与PASSWORD_DEFAULT
创建了哈希。
文档说如果散列失败,password_hash
也可以返回false
。在这种情况下,我会抛出异常,我想仔细测试这个案例。
您是否有$password
字符串password_hash($spassword, PASSWORD_DEFAULT) === false
的示例?
这与password_verify
在与哈希值不匹配时返回false
无关。
答案 0 :(得分:1)
即使它已经很老了,但是我也有同样的问题,并且有点讨厌。所以我在这里分享我的稀疏结果:
password_hash
何时返回null
”。在这种情况下,它无法处理$options
参数中的内容(例如("cost" => -1
)之类的东西,但是它是关于null
而不是false
的。 >
false
和PASSWORD_DEFAULT
都没有PASSWORD_BCRYPT
,5.6和7.4。password-hash
功能)的Compability-Libs可能返回false:
false
情况很难概括(例如,this发生时)。 But even the PHP developers themselves do not test for those,因此给人的印象是它们仅在非常特殊的情况下发生,当用于加密的基础c库失败并且无法用特殊密码触发时。 false
-cases的7.3 deep down in the crypt-libraries null pointers occur for example中也是如此。我还不足以说出这是可能还是什至可能。但是false
有still no tests。false
-case left仍在文档中进行了说明。如您所料,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);
}