hash_equals和strcmp函数之间的区别


Difference between hash_equals and strcmp function

hash_equals——定时攻击安全字符串比较。我想知道什么是定时攻击安全。

我看到了hash_equals 的实现

$result = 0;
    for ($i = 0; $i < $len; $i++) {
        $result |= (ord($known_string[$i]) ^ ord($user_string[$i]));
    }
    // They are only identical strings if $result is exactly 0...
    return 0 === $result;

我想知道时间比较在哪里。

通常,字符串比较(strcmp==)会在第一个不匹配的字符上中断,因此,如果您的密码是12345,并且攻击者提供了9xxxx1xxxx,她可以测量两次比较之间的时间差,并推断第二个字符串更正确(因为第二次比较需要更多时间)。hash_equals通过始终比较两个字符串的所有字符来消除这种类型的攻击,无论它们是否匹配。因此,越来越不正确的字符串将花费相同的时间。