0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Java中的计时攻击

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-09-25 15:29 次阅读

计时攻击

Timing Attack ,时序攻击,是一种侧信道攻击,攻击者尝试分析加密算法的时间执行顺序来推导出密码。每个逻辑运算都需要执行时间,但是 根据不同的输入值,精确测量执行时间,根据执行时间反推出密码的一些区域

简单理解,就是破解密码的人,通过不同的输入策略组合尝试去验证密码,得到不同的执行时间,从而反推出密码的区域,降低破解密码的难度。

下面可以使用Java简单描述一下。

我们看一下Java中的String equals方法(Java17)

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    return (anObject instanceof String aString)
            && (!COMPACT_STRINGS || this.coder == aString.coder)
            && StringLatin1.equals(value, aString.value);
}

//StringLatin1.equals
@IntrinsicCandidate
public static boolean equals(byte[] value, byte[] other) {
    if (value.length == other.length) {
        for (int i = 0; i < value.length; i++) {
            if (value[i] != other[i]) {
                return false;
            }
        }
        return true;
    }
    return false;
}

以上方法中字符串比较一旦遇到不同的字符,那么就直接返回失败。

那么看一下下面的3行代码的执行时间。

"adfg".equals("abcd");
"abfg".equals("abcd");
"abcg".equals("abcd");

以上的3行字符串比较方法执行时间是不同的。

执行时间: 第一行 < 第二行 < 第三行

假如现在我们要猜出另外一个字符串,那么如果我们用暴力穷举猜测字符串,则 根据不同的字符串组合,得到的执行时间是不一样的,那么根据不同的执行时间分析,就可以知道前面几个字符串是否正确,从而缩小范围

以上是一个计时攻击的简单例子,实际密码加密,公私钥加密算法是比较复杂的,但是也要考虑计时攻击的影响。

多年前斯坦福的教授们专门针对这些问题发表过相关的论文,下面这篇于2005年发表在《Computer networks》的期刊论证了远程网络计时攻击的可能性。

图片

计时攻击的防御

那么对于计时攻击这种要如何防止呢, 大部分的做法是使单向加密,或者密码验证的算法执行时间不会随着输入值的不同而规律变化 。换句话说就是 不同的输入值的执行时间相同 ,或者 执行时间随机分布无法规律判断

2009年jdk6的一个升级中就有相关的优化来防止计时攻击。MessageDigest是java.security包里面的类,主要用于SHA或 MD5 等密码上安全的报文摘要功能而设计。最终会用到其equals方法。而这个改动就是针对equals方法。

图片

其中关键的改动就是判断字符串相等时,不再看到不相等的字符就返回false。而是 对比完所有的字符之后再返回结果 。这样代码的执行时间就大致相同。

图片

同时2021年jdk8的补丁也有相关的优化,

图片

乍一看上面的代码已经比较完美了。但是。。。。

密码字符串的信息 还有长度信息

还是有坑哈。。。。。
其实上述中的代码还有一个问题,就是 不同长度的字符串的执行时间也不一样 ,那么如果我搞一轮不同长度字符串穷举之后,可以 根据运行计算时间的不同可以推出密码的长度 。再进行破解相对容易一点。

再看如今Java17中的这个方法, 长度不同时也不会立马返回false ,而是照常执行整个代码,这样就避免了根据执行时间先得到密码的长度。

//MessageDigest
public static boolean isEqual(byte[] digesta, byte[] digestb) {
    if (digesta == digestb) return true;
    if (digesta == null || digestb == null) {
        return false;
    }

    int lenA = digesta.length;
    int lenB = digestb.length;

    if (lenB == 0) {
        return lenA == 0;
    }

    int result = 0;
    result |= lenA - lenB;

    // time-constant comparison
    for (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;
}

小结

以上就是计时攻击的一些简单内容,网络安全中的冰山一角。再次致敬这些维护JDK源码的大师们!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    102994
  • 字符
    +关注

    关注

    0

    文章

    229

    浏览量

    24888
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66766
  • 加密算法
    +关注

    关注

    0

    文章

    205

    浏览量

    25426
收藏 人收藏

    评论

    相关推荐

    arp攻击如何处理

    是反攻击的,她攻击你的,你可以双倍的还回去! 如果你的是采用的DHCP自动分配的, 而且你是一个酒店,那你要甄别在你的网络的电脑是不是你们自己的还是顾客自己带的电脑. ARP攻击没有
    发表于 03-12 09:10

    对嵌入式系统的攻击 攻击者通过什么途径得到ATM的密钥呢?

    的能量损耗数据,最终,从功率脉冲信号获取密码。虽然这种方法耗时,但可以自动操作。此外,攻击者还可能采用故障注入攻击,使微处理器运行在工作范围以外的条件下,从而产生故障信息,导致密码泄漏。攻击
    发表于 08-11 14:27

    最新防攻击教程

    最新防攻击教程 别人攻击的使用方法 传奇防御攻击 传奇攻击方法超级CC 超级穿墙CC 穿金盾CC 穿墙CC攻击器 防穿墙DDOS 传奇网关
    发表于 09-06 20:42

    CC攻击

    CC攻击是DDOS(分布式拒绝服务)的一种,相比其它的DDOS攻击CC似乎更有技术含量一些。这种攻击你见不到虚假IP,见不到特别大的异常流量,但造成服务器无法进行正常连接,听说一条ADSL足以搞掂
    发表于 09-10 15:59

    基于能量攻击的FPGA克隆技术研究

    、Vivado等设计软件增加AES-256 CBC加密配置方式,并在FPGA内部集成解密模块,从而防止硬件设计被克隆和伪造[5]。然而,这种方式并不完全可靠。2011年Moradi等人使用差分能量攻击
    发表于 05-15 14:42

    MCU怎么应对攻击与破解?

    都能提供。即使文件没有烧写的规格,用低成本的示波器几个小时就可以套出需要的波形。如果微控制器不被特殊通用烧写器所支持,仍然可以通过从制造商购买开发板来获得直接完整的协议。 二、时序攻击(Timing
    发表于 12-21 18:12

    SCDN的抗CC攻击和抗DDoS攻击防护是什么?

    300Gbps。另可定制最高达600Gbps防护。CC攻击是什么?CC攻击是 DDOS(分布式拒绝服务) 的一种,DDoS是针对IP的攻击,而CC攻击的是网页。CC
    发表于 01-05 14:45

    Java的常用异常处理方法 java推荐

    Java,异常情况分为Exception(异常)和Error(错误)两大类,Java异常通常是指程序运行过程中出现的非正常情况,如用户输入错误、除数为零、需要处理的文件不存在、数组下标越界等
    发表于 01-19 17:26

    面对外部恶意攻击网站,高防服务器如何去防御攻击

    节点,适用于站长,企业APP,手游,百度竞价,等游戏和网站开发,是网站,游戏用户必选的佛山高防服务器机房!好用不贵! 这正是网络攻击所带来的负面影响,因为在进行流量攻击过程,会直接占用服务器内的资源
    发表于 05-07 17:00

    防御无线传感器网络虫洞攻击是什么?

    虫洞攻击是一种针对无线传感器网络路由协议的特殊攻击,一般由至少两个合谋节点协同发起。合谋节点通过建立起一条高带宽高质量的私有信道来对数据进行吸引和传输,通过扰乱路由分组的传输达到破坏网络正常运行
    发表于 04-15 06:24

    网络攻击的相关资料分享

    持续检测现有网络的流量变化或者变化趋势,从而得到相应信息的一种被动攻击方式。主动攻击:是指通过一系列的方法,主动地获取向被攻击对象实施破坏的一种
    发表于 12-23 07:00

    cc攻击防御解决方法

    静态页面由于动态页面打开速度慢,需要频繁从数据库调用大量数据,对于cc攻击者来说,甚至只需要几台肉鸡就可以把网站资源全部消耗,因此动态页面很容易受到cc攻击。正常情况静态页面只有几十kb,而动态
    发表于 01-22 09:48

    M2354 旁路攻击防护作法与好处

    用于高安全需求的应用,除具备有极高的效能外,更能有效抵挡攻击者的入侵与信息窃取,无论这攻击是来自于网络或是对MCU本身的攻击。 M2354针对常用的密码学算法AES、ECC与RSA更
    发表于 03-01 14:19

    对Rijndael的JAVA差分攻击与防范

    本文探讨了对Rijndael算法的各种攻击,介绍了一种对Rijndael算法差分攻击JAVA实现,提出了几种防范对Rijndael算法差分攻击的方法。关键词:Rijndael;
    发表于 08-22 10:06 14次下载

    Java中的线程状态转换

    Java 中线程的生命周期中一共有 6 种状态。New(新创建);Runnable(可运行);Blocked(被阻塞);Waiting(等待);Timed Waiting(计时等待);Terminated(被终止)。
    的头像 发表于 06-02 10:07 402次阅读
    在<b class='flag-5'>Java</b>中的线程状态转换