php - 随机 sleep 可以防止定时攻击吗?

标签 php security cryptography timing timing-attack

来自 Wikipedia

In cryptography, a timing attack is a side channel attack in which the attacker attempts to compromise a cryptosystem by analyzing the time taken to execute cryptographic algorithms.

实际上,为了防止定时攻击,我使用了以下来自 this answer 的函数:

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;
}

但我在想是否有可能使用随机 sleep 来防止这种攻击

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

或者可能增加 sleep 的随机性

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

这种做法完全可以防止定时攻击?或者只是让工作更难?

最佳答案

This kind of approach can totally prevent timing attacks? Or just make the work harder?

都没有。它不会阻止计时攻击,也不会增加它们的难度。

要了解原因,请查看 docs for sleep .具体第一个参数的含义:

Halt time in seconds.

因此您的应用需要 0.3 秒才能在不休眠的情况下做出响应。 sleep 需要 0.3、1.3、2.3 等...

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

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

但让我们更进一步。假设您使用 usleep 随机休眠.这要细化得多。那就是在几微秒内休眠。

好吧,测量是在 15-50 秒的范围内进行的。因此, sleep 的粒度仍然比正在进行的测量大约 100 倍。所以我们可以平均到单个微秒:

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

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

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

然后你就可以开始玩弄数字了。

但是数据还在。随机性的美妙之处在于您可以将其平均化:

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

运行足够多次,你会得到一个漂亮的图表。您会发现大约有 10000 个不同的数字,因此您可以平均掉随机性并推断出“私有(private)”15。

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

所以我要问的问题是:

当您可以正确解决问题时,为什么还要费心进行类似 sleep 的黑客攻击?

关于php - 随机 sleep 可以防止定时攻击吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28395665/

相关文章:

php - 谷歌分析 API : Get specific data using php

php - `created` 和 `updated` 列的 TIMESTAMP 与 DATETIME

php - 如何在 SQL 查询中使用 session 变量?

java - Spring boot项目如何保存DB用户名和密码

python - 密码学:Python 中的加密

php - Laravel Forge 计划任务上的 504 网关超时错误

PHP 种子、确定性、加密安全 PRNG(伪随机数生成器)。可能吗?

java - 在 javax XML validator 中禁用 DTD

javax.crypto.BadPaddingException : Message is larger than modulus

ios - 智能卡 - 常规验证命令 6A 80