我正在使用 PHP 中的 crypt()
函数来哈希密码,并尝试找出在执行密码检查时测试等式的最安全方法。
我看到有三个选项:
选项1 - 双等号比较
function checkPassword($hash, $password)
{
return crypt($password, $hash) == $hash;
}
选项2 - 三个等号
function checkPassword($hash, $password)
{
return crypt($password, $hash) === $hash;
}
选项3 - strcmp()
function checkPassword($hash, $password)
{
return strcmp(crypt($password, $hash), $hash) === 0;
}
我的直觉告诉我选项1不好,因为它缺乏类型检查,而选项2或3可能更好。但是,我无法确定是否存在一种特定情况下 ===
或 strcmp
会失败。哪个选项对于这个目的最安全?
$2a$10$...$
这样的字符串当作数字时会发生什么... - Polynomial===
即可。如果你真的关心安全性和潜在的时间攻击(即使在网络抖动的情况下),你应该查看此讨论或使用hash_equals()
函数(PHP 5.6+)。另外,你也可以参考这个链接:https://github.com/delight-im/Faceless/pull/5。 - caw