“计时攻击”的版本间的差异
跳到导航
跳到搜索
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;
}
}