“计时攻击”的版本间的差异
		
		
		
		
		
		跳到导航
		跳到搜索
		
				
		
		
	
| Jihongchang(讨论 | 贡献)  (建立内容为“  Timing Attack”的新页面) | Jihongchang(讨论 | 贡献)  | ||
| 第1行: | 第1行: | ||
| + | https://www.douyin.com/user/MS4wLjABAAAAILXvdPy5GrOzGHcjFPWkqgqZY2ELEcTJDz3oTlin47c?modal_id=7173248385904938275 | ||
| − | Timing Attack | + | Timing Attack<syntaxhighlight lang="java"> | 
| + | 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; | ||
| + |     } | ||
| + | |||
| + | } | ||
| + | </syntaxhighlight>上面是判断两个字符串内容是否相同的实现,乍一看有点奇怪: | ||
| + | |||
| + | 一开始先判断字符串长度是否相等,不相等直接返回。 | ||
| + | |||
| + | 之后遍历字符串,对每一位通过异或操作来比较,将每次的结果和 equal 变量进行或运算,如果两个字符串相等,最后存储累积的变量 equal 肯定为0,否则为1。 | ||
| + | |||
| + | 整体逻辑上是没什么问题,但是效率不够好,完全可以进一步优化——在遍历过程中,如果发现有一位不同就可以直接返回,而不是全部遍历一遍。 | ||
| + | |||
| + | |||
| + | 似乎可以优化成:<syntaxhighlight lang="java"> | ||
| + | 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; | ||
| + |     } | ||
| + | |||
| + | } | ||
| + | </syntaxhighlight> | ||
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;
    }
}