这 10 行比较字符串相等的代码给我整懵了,不信你也来看看

2020 年 6 月 7 日
 tl3shi
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;
}

从效率角度上讲,难道不是应该只要中途发现某一位的结果不同了就可以立即返回两个字符串不相等了吗?

这里有解密,欢迎关注讨论。

4264 次点击
所在节点    程序员
18 条回复
xiangyuecn
2020 年 6 月 7 日
如果真需要保护不被时序攻击,理论上这坨代码第一行就会泄露被保密的字符串长度。另外欢迎体验 NullPointerException
jmc891205
2020 年 6 月 7 日
学习了
差点因为烂标题错过一篇好文章
sarvatathagata
2020 年 6 月 7 日
这东西编译器稍微优化优化不就完全不管用了吗
msg7086
2020 年 6 月 7 日
都写了 safe 了,防止侧信道攻击当然要完整对比完了。
msg7086
2020 年 6 月 7 日
@sarvatathagata 按位或还是挺难优化的,要消除运算量必然要加入分支,而现代处理器上跑分支并不见得更快,所以很大可能编译器不会去尝试这些不会提速的优化。
murmur
2020 年 6 月 7 日
大概原理我都懂,不过现在一般都是 hash 存数据库,不代表说改一位时间长就代表那一位是对的
而且都侦测电磁信号了,拿着刀夹脖子逼你说出密码不是更好么
lpts007
2020 年 6 月 7 日
第一次接触,是通过返回时间判断吗,这也太理论了吧? 1 毫秒的区别也不会有吧,干扰因素那么多,整个返回时间根本不是正相关吧
Ultraman
2020 年 6 月 7 日
同问 1L 的问题,或者说长度不重要吗?
jiejiss
2020 年 6 月 7 日
@xiangyuecn #1 是因为语言不同吧,原文写的是 Scala 语言的,字符串的 length 是属性不是方法,不用在调用时计算

我不太懂 Scala,如果 Scala 是把 length 给搞成 getter 了那还是不行
wizardoz
2020 年 6 月 7 日
@Ultraman 长度真不重要,长度信息之于密码就像端口之于 ssh 。
tl3shi
2020 年 6 月 7 日
看来 V 站的都是大神~ NPE 被省去了哈。JDK 中是有的。

```java
public static boolean isEqual(byte[] digesta, byte[] digestb) {
if (digesta == digestb) return true;
if (digesta == null || digestb == null) {
return false;
}
if (digesta.length != digestb.length) {
return false;
}

int result = 0;
for (int i = 0; i < digesta.length; i++) {
result |= digesta[i] ^ digestb[i];
}
return result == 0;
}
```
yukiloh
2020 年 6 月 7 日
我抓包的时候发现,一些网站传到后台的密码 1 不是明文,2 会加满位数
这个题目挺有趣的,但是我觉得不实用
tl3shi
2020 年 6 月 7 日
@jmc891205 这年头难啊,不“标题党”都没人点进来。然后点进来吧,又被吐槽标题党了。
Youen
2020 年 6 月 7 日
zlfoxy
2020 年 6 月 7 日
有点儿基于时间的 sql 盲注的意思。
xuanbg
2020 年 6 月 8 日
比较个字符串怎么实现时序攻击?要攻击的话拦截入参就啥都知道了,还要时序攻击做咩?
killergun
2020 年 6 月 8 日
占楼 学习
Yooloo
2020 年 6 月 8 日
理解思想就好、实际应用这个还没用到过

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/679477

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX