在 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,result
否则不等于。“添加+1”是否也比“继续下一个循环”花费更长的时间?当字节相等时,计算另一个变量(这是无用的)不是更好吗,所以我们总是有相同的运行时间?