Java:为什么要保护此Equal-String函数免受定时攻击

时间:2018-11-14 08:14:07

标签: java timing-attack

在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”所花费的时间也不会比“继续进行下一个循环”所花费的时间更长吗?当字节相等时,累加另一个变量(没用)是否更好,所以我们总是具有相同的运行时间?

1 个答案:

答案 0 :(得分:1)

虽然我们可以做到这一点,但是使用if的实现不仅速度较慢,而且由于优化可能会出现无法预测的问题。

JIT可能会丢弃未使用的变量,CPU分支预测也可能会影响每个分支的执行时间。