随机睡眠可以防止定时攻击吗?当您可以正确解决问题时,为什么要打扰睡眠般的黑客攻击?

来自维基百科

在密码学中,定时攻击是一种侧信道攻击,攻击者试图通过分析执行加密算法所需的时间来破坏密码系统。

实际上,为了防止定时攻击,我使用以下从这个答案中获取的函数:

function timingSafeCompare($safe, $user) {
    // Prevent issues if string length is 0
    $safe .= chr(0);
    $user .= chr(0);

    $safeLen = strlen($safe);
    $userLen = strlen($user);

    // Set the result to the difference between the lengths
    $result = $safeLen - $userLen;

    // Note that we ALWAYS iterate over the user-supplied length
    // This is to prevent leaking length information
    for ($i = 0; $i < $userLen; $i++) {
        // Using % here is a trick to prevent notices
        // It's safe, since if the lengths are different
        // $result is already non-0
        $result |= (ord($safe[$i % $safeLen]) ^ ord($user[$i]));
    }

    // They are only identical strings if $result is exactly 0...
    return $result === 0;
}

但我在想,如果可能的话,使用随机睡眠来防止这种攻击,比如

function timingSafeCompare($a,$b) {
    sleep(rand(0,100));
    if ($a === $b) {
        return true;
    } else {
        return false;
    }
}

或者也许增加睡眠的随机性

sleep(rand(1,10)+rand(1,10)+rand(1,10)+rand(1,10));

这种方法完全可以防止定时攻击吗?或者只是让工作更努力?


答案 1

这种方法完全可以防止定时攻击吗?或者只是让工作更努力?

也不。它不能阻止定时攻击,也不会使它们变得更加困难。

要了解原因,请查看睡眠文档。具体来说,第一个参数的含义:

停止时间(以秒为单位)。

因此,你的应用需要 0.3 秒才能在没有睡眠的情况下做出响应。睡眠需要0.3,1.3,2.3等...

所以说真的,要得到我们关心的部分(时序差),我们只需要砍掉整数部分:

$real_time = $time - floor($time);

但让我们更进一步。假设您使用 usleep 随机睡眠。这要精细得多。这是在微秒内睡觉。

好吧,测量是在15-50秒级进行的。因此,睡眠仍然比正在进行的测量100倍。因此,我们可以平均到一微秒:

$microseconds = $time * 1000000;
$real_microseconds = $microseconds - floor($microseconds);

并且仍然拥有有意义的数据。

你可以走得更远,使用time_nanosleep它可以睡到纳秒级的精度。

然后你可以开始捏造数字。

但数据仍然存在。随机性的美妙之处在于,你可以把它平均出来:

$x = 15 + rand(1, 10000);

运行足够多的次数,你会得到一个漂亮的图表。你会说大约有10000个不同的数字,所以你可以平均随机性并推导出“私人”15。

由于表现良好的随机性是无偏的,因此很容易在足够大的样本上进行统计检测。

所以我要问的问题是:

当您可以正确解决问题时,为什么要打扰睡眠般的黑客攻击?


答案 2

安东尼·费拉拉(Anthony Ferrara)在他的博客文章《时间》(It's All About Time)中回答了这个问题。我强烈推荐这篇文章。

许多人在听说定时攻击时会想:“好吧,我只会添加一个随机延迟!那会起作用的!事实并非如此


推荐