在Stackoverflow上,我发现了以下String-Equal-Function,应该可以抵抗定时攻击。
private boolean equalSignatureString(String signature1, String signature2) {
if(signature1.length() != signature2.length()) {
return false;
}
byte[] signature1Byte = signature1.getBytes();
byte[] signature2Byte = signature2.getBytes();
int result = 0;
for(int i = 0; i < signature1Byte.length; i++) {
result |= signature1Byte[i] ^ signature2Byte[i];
}
return result == 0;
}
我想知道为什么这样可以避免计时攻击。我了解,即使字符串在第一个字符之后不匹配,我们也会比较字符串的完整长度(这可能是计时攻击的重点)。但是,如果signature1Byte[i]
不等于signature2Byte[i]
,那么我们必须在+1上加上+1。难道“加+1”所花费的时间也不会比“继续进行下一个循环”所花费的时间更长吗?当字节相等时,累加另一个变量(没用)是否更好,所以我们总是具有相同的运行时间?
答案 0 :(得分:1)
虽然我们可以做到这一点,但是使用if
的实现不仅速度较慢,而且由于优化可能会出现无法预测的问题。
JIT可能会丢弃未使用的变量,CPU分支预测也可能会影响每个分支的执行时间。