【发布时间】:2016-06-04 18:32:11
【问题描述】:
为了防止timing attacks,有时需要固定时间equals。 MessageDigest.isEqual 没有记录为恒定时间方法,guava HashCode.equals 等。他们都做类似的事情
boolean areEqual = true;
for (int i = 0; i < this.bytes.length; i++) {
areEqual &= (this.bytes[i] == that.getBytesInternal()[i]);
}
return areEqual;
或
int result = 0;
for (int i = 0; i < digesta.length; i++) {
result |= digesta[i] ^ digestb[i];
}
return result == 0;
但是谁说JIT在优化的时候不能引入短路呢?
不难发现,例如areEqual 永远不会再次变为真并打破循环。
我通过根据所有输入位计算一个值并将其提供给自制的Blackhole 来给它a try on CR。
【问题讨论】:
标签: java security optimization timing