strcmp - 意味着什么"二进制安全字符串比较"?这种比较对于定时攻击是否安全?
如果不是,我如何比较两个字符串以防止定时攻击?比较字符串的散列是否足够?或者我必须使用一些为比较提供恒定时间的库(或自己的代码)?
Here写道,定时攻击可以在网络中使用。但是现实世界中存在这种类型的攻击吗?或者这种攻击只能用于小型攻击者(如政府),因此通过网络提供的这种保护是否过剩?
答案 0 :(得分:0)
"二元安全"意味着任何字节都可以安全地与strcmp
进行比较,而不仅仅是某些字符集中的有效字符。快速测试证实strcmp
对定时攻击不安全:
$nchars = 1000;
$s1 = str_repeat('a', $nchars + 1);
$s2 = str_repeat('a', $nchars) . 'b';
$s3 = 'b' . str_repeat('a', $nchars);
$times = 100000;
$start = microtime(true);
for ($i = 0; $i < $times; $i++) {
strcmp($s1, $s2);
}
$timeForSameAtStart = microtime(true) - $start;
$start = microtime(true);
for ($i = 0; $i < $times; $i++) {
strcmp($s1, $s3);
}
$timeForSameAtEnd = microtime(true) - $start;
printf("'b' at the end: %.4f\n'b' at the front: %.4f\n", $timeForSameAtStart, $timeForSameAtEnd);
对我来说,这会打印'b' at the end: 0.0634 'b' at the front: 0.0287
。
PHP中的许多其他基于字符串的函数可能会遇到类似的问题。解决这个问题很棘手,尤其是在PHP中,你实际上并不知道很多函数在物理层面上真正做了什么。
一种可能的策略是在将响应返回给调用者/潜在攻击者之前,在代码中添加一个随机等待时间。更好的是,测量检查输入数据所花费的时间(例如,使用microtime
),然后等待一段随机时间减去该时间量。这不是100%安全,但它使攻击系统变得更加困难,因为攻击者至少必须多次尝试每次输入才能过滤掉随机性。
答案 1 :(得分:0)
strcmp的问题在于它取决于实现。如果它将字符串的每个字节进行二进制比较,直到它到达任一字符串的差异或结尾,那么它很容易受到时序攻击。
哈哈怎么样?
我找到了这个安全问题,我相信它有正确的答案: https://security.stackexchange.com/a/46215
答案 2 :(得分:-2)
时间攻击是一个神话。
我解释一下。
验证文本所需的时间,在一个相似的与另一个相似之间的时间大约是一小部分秒,假设是+/- 0.1秒(夸大了!)。
但是,攻击者测量此时间的时间是:
网络延迟+ 0.1秒+系统延迟(可能是忙于完成其他任务)+其他延迟。
所以不,它不可能,即使对于本地系统(滞后零),时间间隔的结果总是不清楚。