我使用crypt()
在PHP中对哈希密码进行哈希,并且试图找出在执行密码检查时测试结果哈希的相等性的最安全方法。strcmp与==对比在PHP == == ===检查哈希值是否相等
有三种选择,我可以看到:
选项1 - 双等于
function checkPassword($hash, $password)
{
return crypt($password, $hash) == $hash;
}
选项2 - 三人的Equals
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
会失败,我无法解决。哪一个最安全?
阅读它:http://raz0r.name/vulnerabilities/simple-machines-forum/ – user956584
@Userpassword有趣的bug!我想知道PHP在处理数字时如何处理'$ 2a $ 10 $ ... $'这样的字符串...... – Polynomial
如果您只想可靠地比较哈希,只需使用'==='。如果你真的关心安全性和潜在的定时攻击(即使网络抖动),你应该看看[this](https://github.com/delight-im/Faceless/issues/4)或[this] (https://github.com/delight-im/Faceless/pull/5)讨论或使用'hash_equals()'函数(PHP 5.6+)。 – caw