isEqual为什么需要把每一位都进行比较

java.security.MessageDigest.isEqual中有这样一个函数public static boolean isEqual(byte[] digesta, byte[] digestb),用来判断两个字节数组是否相等

image-20240130150852692

我们关注的是这里的代码:对两个字节数组进行逐个字节的异或操作,并将结果保存在变量 result 中。如果这两个字节数组完全相等,最后的结果肯定是0

image-20240130151006346

但为什么不这样写呢,这样不是一个更好的写法吗?

image-20240130151303828

然后我们发现注释是:time-constant comparison,恒定时间比较!背后的原因就是如果采用后面的这种方面完成这个函数就会导致安全问题——定时攻击,他是属于侧信道攻击的一种。

攻击者会尝试输入axxxx、bxxx等密码,通过找到耗时最短的响应所对应的输入密码,则可穷举出一位。如此这般则会得到所有的密文。

所以为了防止这种攻击生效,需要穷尽所有位,这样攻击者就得不到密文之中的信息。

感兴趣的可以参考斯坦福大学在05年的一篇paper:Remote timing attacks are practical, 他就使用定时攻击从基于OpenSSL的web服务器提取出了私钥。在现代密码学中,密码系统的安全性主要依赖于数学算法的复杂性和私钥的机密性,后果可想而知!