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

    文章

    2957

    浏览量

    104542
  • 字符
    +关注

    关注

    0

    文章

    232

    浏览量

    25172
  • 代码
    +关注

    关注

    30

    文章

    4744

    浏览量

    68343
  • 加密算法
    +关注

    关注

    0

    文章

    211

    浏览量

    25529
收藏 人收藏

    评论

    相关推荐

    JavarestTemplate的使用

    JavarestTemplate的使用
    的头像 发表于 01-13 15:41 1020次阅读

    最新防攻击教程

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

    CC攻击

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

    网络攻击的相关资料分享

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

    cc攻击防御解决方法

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

    对Rijndael的JAVA差分攻击与防范

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

    java数组的三种定义方式_java数组的定义及使用方法(推荐)

    java,数组是一种很常用的工具,本文将介绍来java数组的三种定义方式以及java数组的
    发表于 01-29 09:53 3.2w次阅读

    java学习——java的反射学习笔记

    本文档内容介绍了java学习java的反射学习笔记,供参考
    发表于 03-13 14:19 0次下载

    如何预防区块链的日蚀攻击和DDos攻击

    日蚀攻击( Eclipse Attack )是面向对等( P2P )网络的一种攻击类型,攻击者通过攻击手段使得受害者不能从网络的其它部分接
    发表于 08-26 10:43 2266次阅读
    如何预防区块链<b class='flag-5'>中</b>的日蚀<b class='flag-5'>攻击</b>和DDos<b class='flag-5'>攻击</b>

    java怎么使用HTTP代理

    java怎么使用HTTP代理,华益云python爬虫ip
    的头像 发表于 09-01 14:31 1656次阅读

    JavaGet和Post的使用

    JavaGet和Post的使用
    的头像 发表于 01-12 15:38 710次阅读
    <b class='flag-5'>Java</b><b class='flag-5'>中</b>Get和Post的使用

    如何区分Javaprint和println

    在最开始学习Java的时候学到sout+enter键可以输出结果,显示的是System.out.println();而在Python是直接使用print。那么在Javaprint和
    的头像 发表于 02-21 15:10 1212次阅读

    Java创建对象有哪些方式

    1 问题 作为Java开发者,经常创建很多对象,你是否知道Java创建对象有哪些方式呢?
    的头像 发表于 02-24 10:29 1025次阅读

    Java的线程状态转换

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

    Java时间戳的使用

    Java时间戳的使用
    的头像 发表于 11-06 16:04 130次阅读
    <b class='flag-5'>Java</b><b class='flag-5'>中</b>时间戳的使用