关于安全细节 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