我正在使用 crypt()
在 PHP 中对密码进行哈希处理,并试图在执行密码检查时找出最安全的方法来测试生成的哈希值是否相等。
我可以看到三个选项:
选项 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
会失败的特定情况。哪种方法最安全?
最佳答案
说到安全,我更喜欢使用 ===
运算符(operator)。 ===
确保两个操作数完全相同,而无需尝试进行一些强制转换以“帮助”比较以达到成功匹配 - 因为它可能有助于开发,这要归功于松散类型的语言,如 PHP。
当然,其中一个操作数是可信的。来自数据库的散列是可信的,而用户输入则不是。
人们总是可以犹豫一会儿,得出使用 ==
没有风险的结论。在特定情况下。也许。但是比如
"0afd9f7b678fdefca" == 0 is true
"aafd9f7b678fdefca" == 0 is also true
因为 PHP 试图将“散列”转换为数字(可能使用 atoi),结果为 0。虽然不太可能 crypt
返回 0,我更愿意通过使用 ===
来最大化密码不匹配的情况(并接听支持电话) ,而不是通过使用 ==
允许我没有考虑过的罕见情况.
至于strcmp
, 函数返回 <0
或 >0
如果不同,如果相等则为 0。但是
strcmp("3", 0003) returns 0
strcmp("0003", 0003) returns -3
毕竟这并不奇怪。文字 0003
实际上是一个整数,3
由于 strcmp 需要一个字符串,因此 3
将转换为 "3"
.但这表明在这种情况下可能会发生一些转换,因为 strcmp 是一个函数,而 ===
是语言的一部分。
所以在那种情况下我更喜欢 ===
(无论如何都比 ==
快)。
关于php - strcmp vs. == vs. === 在 PHP 中用于检查散列相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14711474/