实用密码学
范学雷
前 Oracle 首席软件工程师,Java SE 安全组成员,OpenJDK 评审成员
14948 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 24 讲
开篇词 (1讲)
课前必读 (1讲)
案例分析 (1讲)
实用密码学
15
15
1.0x
00:00/00:00
登录|注册

10 | 怎么防止数据重放攻击?

你好,我是范学雷。
上一讲,我们讨论了对称密钥分组算法的链接模式,从链接模式出发,我们还分析了 ECB 模式,初始化向量和链接模式的缺失导致了 ECB 模式的安全缺陷,尤其是数据重放攻击。
我们说,有密码学基础知识的工程师,都应该知道 ECB 模式的安全问题,并且不会在应用程序中使用它。这一讲,我们来讨论一个更广泛使用的加密模式,CBC 模式。
CBC 模式,可能是 2018 年之前最常用、最常见的加密模式。和 ECB 模式不同,由于初始化向量和链接模式的使用,CBC 模式解决了数据重放攻击的问题。可是,从 2018 年开始,由于它的安全问题,CBC 模式开始退出历史舞台,尽管这一进程可能需要十数年,甚至数十年。

为什么还要学习 CBC 模式?

不知道你是不是已经有了一个问题:既然 CBC 要退出历史舞台了,我们还学习它干什么呢?
第一个原因,CBC 的退出进程可能需要十数年才能完成。你现在工作的项目种,可能还存在 CBC 模式的大量使用。我们学习了 CBC 模式,有助于你解决现存项目的安全问题。
第二个原因,学习针对 CBC 的攻击方案, 是我们深入理解加密算法安全问题的最好的切入点。了解这些安全缺陷和攻击方案,有助于你更好地使用密码学的算法。因为,这些缺陷也可能换个面孔,出现在应用程序层面。如果你能够说清楚 CBC 模式的攻击办法,也就意味着你已经试着走入了算法的细节。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了数据重放攻击的防范方法,重点关注了CBC(Cipher Block Chaining)模式的加密原理和安全性。CBC模式通过使用初始化向量和前一次的密文分组进行异或运算,解决了数据重放攻击的问题。尽管CBC模式可能逐渐退出历史舞台,但仍有必要学习它的原因。了解其安全问题有助于解决现存项目的安全隐患,并为更高级的协议和更安全的算法打下基础。文章还强调了CBC模式中初始化向量的重要性,指出其唯一性对加密运算的安全性至关重要。此外,文章还讨论了异或运算在密码算法中的广泛应用以及密钥位数变化可能带来的影响。通过对CBC模式的原理和安全性进行深入讨论,读者可以更好地理解加密算法的安全问题,为应用程序的安全设计提供参考。文章还提出了思考题,引导读者通过实际操作来检验密码算法库的安全性,以及使用统计学方法来评估RSA实现的漏洞。这些内容丰富而实用,有助于读者深入理解密码算法的安全性和漏洞分析方法。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《实用密码学》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(17)

  • 最新
  • 精选
  • 可怜大灰狼
    Timing Attack本地写了代码尝试,果然很神奇。java里的String的equals方法是按照字符一个个顺序匹配的,直到碰到不一样会返回。java.lang.String#equals碰到大量分批次有目的破解时,找到每轮中耗时最少出现次数最多的那个值。这样子依次就破解了每个字符。后来改用java.security.MessageDigest#isEqual,就破解不出来了。

    作者回复: 赞!计算时间偏差和算力偏差,是一个很重要的概念。当我们比较含有秘密的信息的时候,不能使用String.equals()这样方法。如果你发现有人比较密钥、口令,使用了String.equals(), 就可以报个漏洞了。密码学是不是也很简单?!

    2020-12-17
    3
    12
  • 天天有吃的
    问题4:如果我们一次只能观测一个字节,一次一位的改变需要 2^8 = 256 次,这样的攻击方式得逞,最多需要 255 * 16 = 4080 次的运算; 之前128次应该是128位每个位数设置为1试试,最多也就128次;但是这句有点不理解,一次改变一个字节byte是啥意思,256这个数值和4080这两个数字代表的是什么含义?

    作者回复: 一次改变一个字节的意思就是攻击的时候,需要一个字节一个字节的尝试。256表示,一个字节有8位,如果每次改变这个字节的一位,需要256次,才能把这个字节所有的可能数值列举完。4080表示攻击一个数据分组需要的计算量,一个字节需要256次,由于尝试了255种可能性后,最后一种可能性就不需要再尝试了,所以不是256,是最多需要255次尝试。一个数据分组16个字节,255乘以16,就是需要的计算次数。

    2020-12-18
    2
    3
  • HU RUONING
    老师你好,是CBC的什么安全问题导致它要退出历史?2018年有什么标志性事件让CBC需要退出历史舞台吗?

    作者回复: CBC的安全问题就是我们这几个章节描述的问题。最有标志性的事件就是TLS 1.3协议彻底放弃的CBC算法。

    2021-05-19
    1
  • tommyCmd
    讲的太好了,后面老师可以讲一些非对称密钥算法,密钥协商,密钥衍生等场景吗

    作者回复: 很抱歉,这些内容现在的专栏里没有涉及。目前还不知道以后会不会有机会讲一讲非对称和协议部分。

    2022-11-18归属地:美国
  • Reol
    老师,关于CBC模式加密和解密的区别:解密时,每个分组的输入需要自己的密文和前一分组的密文,密文都是已知的,这么说每个分组的解密运算都是独立的,不依赖其他分组的解密结果。 那么CBC模式的解密运算是否可以 并行化 来提高效率?

    作者回复: 解密需要前一个分组的密文,这就限制了并行的能力。如果分组的密文都已经知道了,就可以并行计算了;如果前面的密文有缺失,就要等待接收缺失的密文。所以,它的并行计算受限制的。

    2021-08-20
  • HU RUONING
    2018年后退出历史舞台,是因为“2018 年新发布的 TLS 协议,甚至完全抛弃了 CBC 模式”这个吗?

    作者回复: 是因为CBC本身的问题,这个事件只是业界对待CBC问题的一个表现。

    2021-05-19
  • 😁😁老师好,这次课上讲到,可以通过一次改变一位的方式 进行攻击。那么通过这种每次变一位的比较,是为了得到秘钥的值么。而且比较中是不是要用同一个初始化变量呢?还是说因为异或运算的归零性和恒等性,可以抹掉不同值初始化变量影响。学到这开始“恨爸妈少给我生一个脑子了”,可能问的毫无逻辑行😂😂

    作者回复: 是为了得到明文。下面的问题,我们后面还会详细讲,所以这一节我也没有交代细节。

    2020-12-30
  • maver
    “如果我们一次改变一位数据的攻击方式得逞,最多需要 128 次的运算;” 老师,请问这种一次改变一位数据的攻击方式,有实际可行的攻击手段吗?还是说只是理论上存在可能性?

    作者回复: 是已经实证的攻击方法。

    2020-12-22
    2
  • 天天有吃的
    问题5:初始化向量不需要保密,是不是可以这么理解,他会随着第一个数组分组最为加密信息传下去,加密方式是保密的,初始化向量也会变成加密信息的一部分?

    作者回复: 初始化向量不需要保密的意思,就是初始化向量可以公开,可以让攻击者知道。

    2020-12-18
  • 天天有吃的
    问题3:有点没法想象...噪音跟温度还能用来破解密码,硬件层面都能破解软件编写的程序吗,纯好奇这个场景是怎么样的?

    作者回复: 软件使用过硬件运转的,比如如果计算复杂,CPU就会加快,温度会升高,风扇会加速,噪音也会加大,计算结果会延迟,这些都是外部可以观察到的结果。感兴趣细节的话,可以看看这篇报道,https://threatpost.com/side-channel-poc-attack-targets-encryption-software-glitch/136703/,以及https://www.usenix.org/system/files/conference/usenixsecurity18/sec18-alam.pdf,还有这个https://www.cs.tau.ac.il/~tromer/papers/radioexp-20150227.pdf

    2020-12-18
收起评论
显示
设置
留言
17
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部