我在用着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 可能会更好。但是,我无法确定是否存在特定情况===
or strcmp
会失败。对于此目的,哪个最安全?
当谈到安全性时,我更喜欢使用===
操作员。===
确保两个操作数完全相同,而无需尝试进行一些转换以“帮助”比较以实现成功匹配 - 因为由于松散类型语言(如 PHP),它可能会在开发时有所帮助。
当然,操作数之一是可信的。数据库中的哈希值是可信的,而用户输入则不然。
人们总是可以犹豫一会儿,得出的结论是使用没有风险==
在特定情况下。或许。但例如
"0afd9f7b678fdefca" == 0 is true
"aafd9f7b678fdefca" == 0 is also true
当 PHP 尝试将“散列”转换为数字时(可能使用atoi) 给出 0。虽然不太可能crypt
返回 0,我更愿意通过使用最大化密码不匹配的情况(并应答支持电话)===
,而不是允许我没有想到的罕见情况使用==
.
As for strcmp
,函数返回<0
or >0
如果不同,则为 0;如果相等,则为 0。但
strcmp("3", 0003) returns 0
strcmp("0003", 0003) returns -3
毕竟这并不奇怪。字面意义0003
实际上是一个整数,3
自从strcmp需要一个字符串,3
将被转换为"3"
。但这表明在这种情况下可能会发生一些转换,因为strcmp是一个函数,而===
是语言的一部分。
所以在这种情况下我的偏好是===
(这比==
反正)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)