计时攻击
Jihongchang(讨论 | 贡献)2022年12月5日 (一) 18:09的版本
Timing Attack
public class Test {
private boolean safeEqual(String a, String b) {
if (a.length() != b.length()){
return false;
}
int equal = 0;
for (int i = 0; i < a.length(); i++){
equal |= a.charAt(i) ^ b.charAt(i);
}
return equal == 0;
}
}
上面是判断两个字符串内容是否相同的实现,乍一看有点奇怪:
一开始先判断字符串长度是否相等,不相等直接返回。
之后遍历字符串,对每一位通过异或操作来比较,将每次的结果和 equal 变量进行或运算,如果两个字符串相等,最后存储累积的变量 equal 肯定为0,否则为1。
整体逻辑上是没什么问题,但是效率不够好,完全可以进一步优化——在遍历过程中,如果发现有一位不同就可以直接返回,而不是全部遍历一遍。
似乎可以优化成:
public class Test1 {
private boolean safeEqual(String a, String b) {
if (a.length() != b.length()){
return false;
}
for (int i = 0; i < a.length(); i++){
int equal = a.charAt(i) ^ b.charAt(i);
if (equal !=0 ) {
return false;
}
}
return true;
}
}