关于安全细节 Timing Attack

since:2021年5月22日 21:12

auth: Hadi

参考:

https://zhuanlan.zhihu.com/p/150689564

https://www.oracle.com/java/technologies/javase/6u17.html

前言

在知乎看到一些关于安全理论的帖子,这里我也拉过来水一片博客。参考的代码为Sacla中safeEqual字符串比较相关。

在String中的安全比较的源码如下:

def safeEqual(a: String, b: String) = {
  if (a.length != b.length) {
    false
  } else {
    var equal = 0
    for (i <- Array.range(0, a.length)) {
      equal |= a(i) ^ b(i)
    }
    equal == 0
  }
}

 

看见这个代码的时候还是比较疑惑的,第一部分:长度不一致的时候返回false;第二部分使用位运算去比较每一位的值,然后取并值进行返回,所有只要有一位不一致那么就为false。看着代码好像没什么问题,但是这个是一个常用方法,对此可以优化的点相比大家都了解,直接比较每一位如果发现位长有问题直接返回false就行了,那么为什么safeEqual要这样呢?

 

 

安全的代价

很明显,这个方法强调了这个方法是安全的,这个方法的实刻意降低了效率,在java中也有安全类java.security.MessageDigest中有isEqual有相同的写法。那么为什么这样进行书写呢?

 

Timing Attack

计时攻击(为什么想起星际)。

就是通过功耗、时序、电磁泄露等方式达到破解的目的。在很多物理隔绝的环境中,往往也能出奇制胜;这种攻击的有效性远远高于传统的密码分析的数学方法。比如当我们调用isEqual的时候,很可能就是比较密码是否一致。safeEqual("abcdefg","Abcdefg") 和safeEqual("abcdefg","abcdefG") 第一位不同和最后一位不同,他们运行的时间是完全不一样的,这样可以防止通过大量的改变输入,并计算统计时间来暴力破解出比较的字符串。

在我们正常编写的时候,都会为了高效进行直接返回,但是忽视了他人可以利用这一点来破解我们设置的安全。

 

在Java SE 6 Update中正式加入了MessageDigest.isEqual https://www.oracle.com/java/technologies/javase/6u17.html

 

 

 

 

后记

简短,但告知我们魔高一尺道高一丈,在安全与破解两个方面,都是此消彼长的,他们互相攻击,不断完善,努力的提高代码的有效性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值