关于安全细节 Timing Attack

Posted 青冬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于安全细节 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

 

 

 

 

后记

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

以上是关于关于安全细节 Timing Attack的主要内容,如果未能解决你的问题,请参考以下文章

A 8b Time-Interleaved Time-Domain ADC with Input-Independent Background Timing Skew Calibration(代码片段

SeedLab - Cross-Site Scripting Attack

64位linux系统:栈溢出+ret2libc ROP attack

Chrome浏览器的Timing分析

向Linus学习,让代码具有good taste

关于SQLite远程代码执行漏洞的安全公告