安全播报

防御吧作为15年知名老牌域名服务商,CNNIC和CANN双认证域名注册商,已经
持续为500多万个域名提供服务,包括智能DNS/自由转移/隐私保护等服务!
Equals与时间序列攻击
2023-09-27 11:47:52 【

随着信息技术的迅速发展,网络安全和隐私问题变得愈发重要。黑客和攻击者不断寻找新的攻击方法,其中之一是时间序列攻击(Timing Attack)。时间序列攻击是一种侧信道攻击,攻击者试图通过测量程序的执行时间来推断程序内部的信息。

什么是时间序列攻击?

时间序列攻击,又称时序攻击,是一种利用计算机程序或系统的执行时间来推断内部信息的攻击方法。攻击者通过观察程序的执行时间来猜测程序内部的敏感信息,例如密码、密钥或其他机密数据。时序攻击通常是一种侧信道攻击,因为攻击者不直接访问内部数据,而是通过侧信道(即程序的执行时间)来获取信息。

如何进行时间序列攻击与防御?

时间序列攻击的攻击者通常执行以下步骤:

  • 选择目标:攻击者选择一个目标,通常是一个包含敏感信息的系统或程序。

  • 构建攻击模型:攻击者分析目标系统的执行时间,构建一个攻击模型,以了解如何根据执行时间来推断内部信息。

  • 执行攻击:攻击者通过多次执行相同操作,并测量每次操作的执行时间,来获取足够的时间数据。

  • 分析数据:攻击者分析收集到的时间数据,寻找执行时间的差异,以推断出内部信息的可能值。

java模拟时间序列攻击

模拟时间序列攻击。它通过在 isEquals 方法中引入时间延迟,来模拟攻击者通过测量程序执行时间来猜测两个字节数组的内容是否相等。根据不同的字节数组内容,程序会输出不同的执行时间,以演示如何利用执行时间的差异来进行攻击

publicclassTest{publicstaticvoidmain(String[] args){// 记录开始时间Long start =System.currentTimeMillis();// 调用isEquals方法比较两个字节数组的内容isEquals("adfg".getBytes(),"abcd".getBytes());// 计算并输出比较 "adfg" >> "abcd" 的时间差System.out.println("比较 adfg  >>  abcd 时间: "+(System.currentTimeMillis()- start));        start =System.currentTimeMillis();isEquals("abfg".getBytes(),"abcd".getBytes());System.out.println("比较 abfg  >>  abcd 时间: "+(System.currentTimeMillis()- start));        start =System.currentTimeMillis();isEquals("abcg".getBytes(),"abcd".getBytes());System.out.println("比较 abcg  >>  abcd 时间: "+(System.currentTimeMillis()- start));}// 自定义方法,用于比较两个字节数组的内容publicstaticBooleanisEquals(byte[] digesta,byte[] digestb){for(int i =0; i < digesta.length; i++){// 模拟时间延迟,每次比较等待100毫秒Test.sleep(100L);// 如果发现不同的字节,返回false,表示内容不相等if(digesta[i]!= digestb[i]){returnfalse;}}// 所有字节都相等,返回true,表示内容相等returntrue;}// 自定义方法,用于让当前线程休眠指定的毫秒数publicstaticvoidsleep(Long millis){try{Thread.sleep(millis);}catch(InterruptedException e){            e.printStackTrace();}}}
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

  • 11.

  • 12.

  • 13.

  • 14.

  • 15.

  • 16.

  • 17.

  • 18.

  • 19.

  • 20.

  • 21.

  • 22.

  • 23.

  • 24.

  • 25.

  • 26.

  • 27.

  • 28.

  • 29.

  • 30.

  • 31.

  • 32.

  • 33.

  • 34.

  • 35.

  • 36.

  • 37.

  • 38.

  • 39.

  • 40.

  • 41.

  • 42.

这段代码模拟了时间序列攻击的情景,通过不同的字节数组内容和模拟的时间延迟,演示了如何利用执行时间的差异来进行攻击。请注意,这种方式只是模拟,实际的时间序列攻击更为复杂和不道德。

执行结果:

比较 adfg  >>  abcd 时间: 207比较 abfg  >>  abcd 时间: 317比较 abcg  >>  abcd 时间: 412
  • 1.

  • 2.

  • 3.

因为两个字符串从左到右相匹配的字节不同,所以每次进行比较的时间不相等:abcg > abfg > adfg

要防范时间序列攻击,可以采取以下措施:

  • 实施时间恒定的算法:在密码学和安全相关的应用中,使用时间恒定的算法,确保无论输入的数据如何,执行时间都保持不变。这可以防止攻击者根据执行时间来猜测敏感信息。

  • 引入随机性:在比较和处理敏感信息时,引入随机的等待时间,以干扰攻击者的时间测量。

  • 使用受信任的密码学库:在处理密码学操作时,使用受信任的密码学库,这些库已经考虑了时序攻击的防护措施。

  • 监测和审计:定期监测系统的执行时间和响应时间,以检测潜在的时序攻击。

Java方法更改

publicstaticBooleanisEquals(byte[] digesta,byte[] digestb){Boolean temp =true;for(int i =0; i < digesta.length; i++){Test.sleep(100L);if(digesta[i]!= digestb[i]){            temp =false;}}return temp;}
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

全部遍历,即使两个字符串从左到右相匹配的字节不同,但是比对次数相同,故时间相等:abcg = abfg = adfg

MessageDigest.isEqual() 方法介绍

MessageDigest.isEqual() 方法不是标准Java API 的一部分,而是可能在一些安全库或密码学库中自定义的方法。然而,它的作用是比较两个字节数组是否相等,通常用于安全相关的应用,以防止时间序列攻击(Timing Attack)等侧信道攻击。

publicstaticbooleanisEqual(byte[] digesta,byte[] digestb){if(digesta == digestb)returntrue;if(digesta ==null|| digestb ==null){returnfalse;}int lenA = digesta.length;int lenB = digestb.length;if(lenB ==0){return lenA ==0;}int result =0;    result |= lenA - lenB;// time-constant comparisonfor(int i =0; i < lenA; i++){// If i >= lenB, indexB is 0; otherwise, i.int indexB =((i - lenB)>>>31)* i;        result |= digesta[i]^ digestb[indexB];}return result ==0;}
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

  • 11.

  • 12.

  • 13.

  • 14.

  • 15.

  • 16.

  • 17.

  • 18.

  • 19.

  • 20.

  • 21.

  • 22.

  • 23.

  • 24.

这个方法的主要特点是,它会在比较两个字节数组时采用时间恒定的比较方式,确保无论两个字节数组的内容是否相等,执行时间都保持相同。这是为了防止攻击者通过测量执行时间的差异来猜测内部数据。

时间序列攻击是一种隐蔽的攻击方法,可用于推断内部信息,威胁安全和隐私。在设计和实现安全系统时,应该认真考虑时序攻击,并采取适当的防护措施,以确保敏感信息的保密性和完整性。随着安全技术的不断发展,我们可以更好地应对这种类型的威胁,保护我们的数据和系统。时序攻击是一个不断演变的领域,需要持续的研究和关注,以确保我们的安全措施足够健壮。


】【打印关闭】 【返回顶部
分享到QQ空间
分享到: 
上一篇零信任无法保护到的5个领域 下一篇高防服务器与秒解服务器关系解读

立足首都,辐射全球,防御吧专注云防御及云计算服务15年!

联系我们

服务热线:010-56157787 ,010-56159998
企业QQ:4000043998
技术支持:010-56159998
E-Mail:800@fangyuba.com
Copyright ? 2003-2016 fangyuba. 防御吧(完美解决防御与加速) 版权所有 增值许可:京B2-20140042号
售前咨询
公司总机:4000043998 01056155355
24小时电话:010-56159998
投诉电话:18910191973
值班售后/技术支持
售后服务/财务
备案专员
紧急电话:18610088800