这意味着:比较两个字符串$a和$b长度恒定时间


What that mean: Compare two strings $a and $b in length-constant time?

在学习密码哈希和保存在数据库中时,我发现了这篇文章:https://crackstation.net/hashing-security.htm#phpsourcecode

一切都很清楚,除了这个我无法理解的功能,为什么不使用正常的相等?这意味着:比较两个字符串$a和$b的长度恒定时间。

// Compares two strings $a and $b in length-constant time.
function slow_equals($a, $b)
{
    $diff = strlen($a) ^ strlen($b);
    for($i = 0; $i < strlen($a) && $i < strlen($b); $i++)
    {
        $diff |= ord($a[$i]) ^ ord($b[$i]);
    }
    return $diff === 0;
}

当您通常比较两个字符串是否相等时,如果遇到第一个不相等,算法就会停止。

像这样:"aaa" == "aba"?第一个角色?都是"a"。第二个角色?"a"不是"b",所以为了节省时间,请停在这里。最后一个字符不进行比较。

在比较与安全相关的字符串时,攻击者可能会知道哪个字符是正确的,哪个字符是错误的,因为这种比较函数的运行时。

考虑一下使用纯文本密码的不安全做法。如果攻击者可以通过测量密码比较运行的时间来确定他猜测的密码的第一个字符是否正确,那么他只需要大约 62 次猜测(字母字符大小写和数字)即可知道第一个字母。使用一个字母,运行时更长,因为第一个字母与实际密码相同,并且比较了第二个字母。现在第二个字母被迭代了。经过 62 次猜测,已知。

这大大削弱了安全性,因为不知道第一个字母是否正确,您需要对两个字母的密码进行 62*62 次猜测。有了线索,你只需要 62 + 62 次猜测。

长度常量比较函数比较所有字母,并且仅在末尾显示字符串是否匹配。这样你就无法知道哪个字母已经是正确的。

哈希

字符串会混淆一些事情,但是因为您无法知道攻击者是否预先生成了一堆哈希,或者正在动态生成它们,并且在哈希不匹配时不会暴力破解相应的密码,您不希望任何人知道该哈希不匹配的地方。这是一个很小的附加安全组件,但是一个非常重要的组件。