比较散列字符串的最佳方法是什么?(PHP)

web*_*at0 6 php string comparison

我应该使用if(strcmp(md5($string),$hash)==0)if(md5($string)==$hash)

MM.*_*MM. 25

在比较哈希时,你应该非常小心地进行身份验证,因为你可能会打开窗口进行定时攻击.

虽然听起来非常违反直觉,但你应该对字符串进行全面比较,避免任何优化(即如果字符不同则提前退出).

以下是有关此问题的一些链接:

以下是一些想法,以解决它:


小智 16

如果比较字符串,请使用strcmp===.人们更喜欢,===因为strcmp它可能令人困惑(它0取决于成功,wat).

你必须使用===,而不是==.==将两个操作数转换为整数,如果它们可以解释为这样,并且因为MD5哈希不适合整数,它们将被截断一半.因此,只有哈希的前半部分必须相等.请参见http://phpsadness.com/sad/47.

如果您正在散列密码,请考虑使用缓慢而强大的散列算法,例如PBKDF2,而不是MD5.

  • 哇......真的很伤心. (4认同)

san*_*mai 5

如果您使用比 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 字符。