В 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» также занимает больше времени, чем «просто перейти к следующему циклу»? Не лучше ли подсчитать другую переменную (которая бесполезна), когда байты равны, поэтому у нас всегда одинаковое время выполнения?