“计时攻击”的版本间的差异

来自姬鸿昌的知识库
跳到导航 跳到搜索
(建立内容为“ Timing Attack”的新页面)
 
第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的版本

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

}