-1

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

4

1 回答 1

1

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

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

于 2018-11-14T08:38:37.820 回答