我尝试用两种语言(Java 和 Python)重现字符串比较计时预言,但我没有看到基于比较输入的计时有任何相关性。是否有任何示例,或者您是否发现我的代码有问题?请注意,我想要一些简单的东西,就像我给出的例子一样。“在野外”对大型程序的攻击不是一个很好的例子。
我也找不到任何简单且可立即运行的定时攻击示例。我相信我已经使用 -Djava.compiler=NONE 禁用了 Java 的优化。运行代码需要花费大量时间,因此显然没有完全优化代码。
经常谈论这似乎很奇怪,但是那里没有实际的容易找到的例子。
这是我今天的 Java 代码。输出有点随机变化,我已经确定没有明显的相关性。我在输出中添加了一些注释,这样你就可以看到哪个比较慢。
public class TimingAttackJavaTest {
public static void main(String[] args) {
TimeCompare("a0", "b0", "a, b ");
TimeCompare("aaaaaaaaaa1", "bbbbbbbbbbb1", "a*10, b*10");
TimeCompare("aaaaaaaaaa10", "bbbbbbbbbbb10", "a*10, b*10");
TimeCompare("aaaaaaaaaa2", "b2", "a*10, b ");
TimeCompare("a3", "bbbbbbbbbbb3", "a, b*10 ");
TimeCompare("aaaaaaaaaa4", "bbbbbbbbbbb4", "a*10, b*10 ");
TimeCompare("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1", "a*100, a*100");
TimeCompare("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1", "a*100, a*100");
TimeCompare("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "a*100, b*100");
TimeCompare("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "a*100, b*100");
TimeCompare("a", "a", "a, a ");
TimeCompare("aaaaaaaaaaa", "aaaaaaaaaaa", "a*1, a*10 ");
TimeCompare("1aaaaaaaaaa10", "2bbbbbbbbbbb10", "a*10, b*10");
}
static void TimeCompare(String a, String b, String outputLabel)
{
boolean temp = false;
long startTime;
long endTime;
long duration;
startTime = System.nanoTime();
for(int i = 0; i < 10000000; i++)
{
temp = a.equals(b);
}
endTime = System.nanoTime();
duration = endTime - startTime;
System.out.println(outputLabel + temp + "\t\t" + duration);
}
}
输出(请注意,随着程序的启动,第一次比较总是很慢):
a, b false 930418800
a*10, b*10false 513034800
a*10, b*10false 510905300
a*10, b false 534267200
a, b*10 false 524720700
a*10, b*10 false 509250100
a*100, a*100false 516159000 **This should return slowly**
a*100, a*100false 508714700 **This should return slowly**
a*100, b*100false 511160700 **This should return quickly**
a*100, b*100false 522029800 **This should return quickly**
a, a true 278492700
a*1, a*10 true 284238900
a*10, b*10false 506245000