Pol*_*ial 16 php security string crypt bcrypt
我正在使用crypt()PHP中的密码哈希,并且我正在尝试在执行密码检查时找出最安全的方法来测试生成的哈希的相等性.
我可以看到三个选项:
选项1 - 双等于
function checkPassword($hash, $password)
{
return crypt($password, $hash) == $hash;
}
Run Code Online (Sandbox Code Playgroud)
选项2 - 三等于
function checkPassword($hash, $password)
{
return crypt($password, $hash) === $hash;
}
Run Code Online (Sandbox Code Playgroud)
备选案文3 - strcmp()
function checkPassword($hash, $password)
{
return strcmp(crypt($password, $hash), $hash) === 0;
}
Run Code Online (Sandbox Code Playgroud)
我的直觉告诉我,由于缺乏类型检查,选项1是一个坏主意,选项2或3可能更好.但是,如果有特定情况===或者strcmp会失败,我就无法解决.哪个是最安全的?
Rin*_*g Ø 20
说到安全性,我更喜欢使用===运营商.===确保两个操作数完全相同,而不是试图容纳一些转换以"帮助"比较以达到成功的匹配 - 因为它可能有助于在开发时感谢松散类型的语言,如PHP.
当然,其中一个操作数是可信的.数据库中的哈希是可信的,而用户输入则不可信.
一个人总是可以沉溺一段时间,得出结论==在特定情况下没有风险.也许.但举个例子
"0afd9f7b678fdefca" == 0 is true
"aafd9f7b678fdefca" == 0 is also true
Run Code Online (Sandbox Code Playgroud)
因为PHP试图将"哈希"转换为一个数字(可能使用atoi),它给出了0.虽然不太可能crypt返回0,但我更愿意最大化密码不匹配的情况(并回答支持调用)通过使用===,而不是允许我没有考虑使用的罕见情况==.
至于strcmp,函数返回<0或>0如果不同,0如果相等.但
strcmp("3", 0003) returns 0
strcmp("0003", 0003) returns -3
Run Code Online (Sandbox Code Playgroud)
毕竟这并不奇怪.文字0003实际上是一个整数,3因为strcmp需要一个字符串,所以3它将被转换为"3".但是这表明在这种情况下可能会发生一些转换,因为strcmp是一个函数,而它===是语言的一部分.
所以我在这种情况下的偏好===(比==任何时候都快).
小智 6
您应该使用PHP内置的hash_equals()函数.没有必要自己动手.hash_equals()将返回一个布尔值.
在我看来,使用==或===来比较字符串,更不用说散列字符串通常不是一个好主意.
| 归档时间: |
|
| 查看次数: |
8764 次 |
| 最近记录: |