计时攻击

来自姬鸿昌的知识库
Jihongchang讨论 | 贡献2022年12月5日 (一) 18:09的版本
跳到导航 跳到搜索

https://www.douyin.com/user/MS4wLjABAAAAILXvdPy5GrOzGHcjFPWkqgqZY2ELEcTJDz3oTlin47c?modal_id=7173248385904938275

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;
    }

}