web*_*at0 6 php string comparison
我应该使用if(strcmp(md5($string),$hash)==0)或if(md5($string)==$hash)
MM.*_*MM. 25
在比较哈希时,你应该非常小心地进行身份验证,因为你可能会打开窗口进行定时攻击.
虽然听起来非常违反直觉,但你应该对字符串进行全面比较,避免任何优化(即如果字符不同则提前退出).
以下是有关此问题的一些链接:
以下是一些想法,以解决它:
hash_equals()(如果可用)(PHP 5.6及更高版本).hash_equals()填充工具)compareStrings())小智 16
如果比较字符串,请使用strcmp或===.人们更喜欢,===因为strcmp它可能令人困惑(它0取决于成功,wat).
你必须使用===,而不是==.==将两个操作数转换为整数,如果它们可以解释为这样,并且因为MD5哈希不适合整数,它们将被截断一半.因此,只有哈希的前半部分必须相等.请参见http://phpsadness.com/sad/47.
如果您正在散列密码,请考虑使用缓慢而强大的散列算法,例如PBKDF2,而不是MD5.
如果您使用比 PHP 5.6(包括)更新的任何东西,您应该使用时间攻击安全字符串比较函数。
if (hash_equals($expected, $correct)) {
}
Run Code Online (Sandbox Code Playgroud)
(如果您使用的是 PHP 5.5 或更早版本,请参阅此处了解等效内容。)
Luk*_*lze -4
我认为if(md5($string) == $hash)更好,因为你只有一个比较,而不是 2 个(stcmp & ==)。
md5 仅生成不需要二进制安全比较的 ascii 字符。