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

05|如何有效避免长度延展攻击?

你好,我是范学雷。
上一讲,我们列举了常见的单向散列函数,我们还知道了退役的、遗留的和现行的算法,通过对处理能力限制和算法的性能的讨论,我们对如何选择哈希算法有了更明确的认知。
还记得我们留了一个小尾巴吗?我们提到了“长度延展攻击”。“长度延展攻击”是怎么一回事?我们为什么要了解它?在单向散列函数的使用上,我们需要注意哪些安全问题?
这就是我们这一次要解决的事情。

什么是长度延展攻击?

我们先来看看什么是“长度延展”,这样会有利于你理解“长度延展攻击”。
现在,假设我们有两段数据,S 和 M,以及一个单向散列函数 h。如果我们要把这两段数据合并起来,并且还要计算合并后的散列值,这就叫做单向散列函数的长度延展。
不过,问题来了,是 S 放在前面(h(S|M)),还是 M 放在前面(h(M|S))?既然,我们说,散列值是无法预测的,那么,数据编排的顺序有意义吗?
如果 S 和 M 都是公开的信息,顺序是不重要的。可如果 S 是机密信息,M 是公开信息,这两段数据的排列顺序就至关重要了。如果机密信息放在了前面,就存在“长度延展攻击”的风险
弄清楚了长度延展,长度延展攻击就很好理解了,就是说我们可以利用已知数据的散列值,计算原数据外加一段延展数据后的散列值。也就是说,如果我们知道了 h(S|M),我们就可以计算 h(S|M|N)。其中,数据 N 就是原数据追加的延展数据。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

单向散列函数的应用及注意事项 单向散列函数在密码学中扮演着重要角色,但其存在长度延展攻击的风险。这种攻击利用已知数据的散列值,计算原数据外加一段延展数据后的散列值,从而构造出一个新的合法的URL,获得不同的授权。为了避免这种攻击,建议不要单纯使用单向散列函数处理既包含机密信息、又包含公开信息的数据,而是应该使用设计好的、经过验证的算法,比如消息验证码和基于单向散列函数的消息验证码。此外,文章还提到了一些算法的安全级别,以及在处理混合了机密信息和公开信息的数据时需要注意的原则。 典型的单向散列函数使用场景包括校验数据完整性、数字签名、消息验证码、生成伪随机数和生成对称密钥。然而,单纯使用单向散列函数校验数据完整性需要确保给定的散列值是不能被修改的,这是这个使用场景的限制。 通过今天的讨论,读者应该了解到单向散列函数存在长度延展攻击的风险,以及避免这种攻击的方法。此外,读者还应该尽量避免单纯使用单向散列函数来处理包含机密信息的数据。在本模块中,读者还应该掌握单向散列函数的基本概念和最佳实践,包括安全强度、推荐算法和避免使用退役的算法等。 思考题则引导读者去发现更多的单向散列函数使用场景,鼓励他们探索利用散列值长度固定的特点和碰撞困难的特点,以及留下讨论和记录新使用场景的空间。 这篇文章深入解释了长度延展攻击的原理和危害,并提供了避免攻击的实用建议,对于想要了解单向散列函数应用及注意事项的读者来说,是一篇具有实际指导意义的文章。

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

全部留言(23)

  • 最新
  • 精选
  • zzzz
    老师,我可能理解的特别不好,但是找了好多资料依然不能理解这个“长度延展攻击”,反而越找越乱,所以只能来留言问您了,希望您还能回复。 1,什么是机密信息啊?机密信息是只有写机密信息的人才能用的机密信息吗?机密信息的作用是什么呢? 2,M是一般信息,S表示机密信息,为什么我们额外加的数据N只能在M后面而不能在S后面呢?无论S和M如何组合,不都是信息吗?我们把S和M的任意排列认为是data的话,按照图里说的,hash(hash(data)+自己加的数)=hash(data+自己加的数) 这个公式都是成立的啊,所以S和M如何排序重要吗? 3 ,长度延展攻击到底想做什么啊,只是得到hash(data+自己加的数) 有什么作用吗? 老师,我看大家都没有问过我说的这些问题,所以可能我理解的特别特别不好。但是我也真的认真看了,也对不懂的地方查了很多很多资料,还是不明白,希望老师能够帮助我,谢谢老师!

    作者回复: 1. 机密信息也就是私密信息,是需要保密的信息,比如你的银行账户密码。 2. 你可以试着理一理计算的过程。按照文中的例子,M是S的持有者派发出去的,并使用hash(S|M)签名。S的持有者并不需要保存M和hash(S|M)签名。也就是说信息的接收者收到的是M和hash(S|M)签名。要想得到授权,信息的接收者还要把这两段信息送回来,也就是M和hash(S|M)签名。然后S的持有者,根据M重新计算hash(S|M)。如果重新计算的签名和接收到的签名是一样的,也就是说,这个数据是S的持有者派发出去的原始数据,没有篡改,可以授权信息的接收者。如果不一样,也就是说,这个数据不是S的持有者派发出去的原始数据,不能授权信息的接收者。 为什么S|M的拼接方式成立呢?因为信息的接收者可以把M延展成M'(M|N)(延展办法参考正文),然后被M'送给S的持有者,还包括延展后的hash(S|M')签名。S的持有者重新计算hash(S|M')签名,然后对比接收到的hash(S|M')签名。由于hash(S|M')签名是攻击者通过延展构造的,S的持有者的检验过程不能够识别篡改,因此会认为M'(M|N)就是自己发送出去的数据,授权就被攻破了。 为什么M|S的拼接方式不成立呢?因为延展攻击的计算链条被打破了。按照延展攻击的计算链条,攻击者可以计算M|S|N的散列值,但是不能计算M|N|S的散列值。如果攻击者把M'(M|N)送给S的持有者,S的持有者计算的是hash(M|N|S),而不是hash(M|S|N)。攻击当然是不成立的。 3. 长度延展攻击可以伪造含有机密信息的散列值的计算。具体的破坏性要看具体的场景,文中的例子破坏了授权。比如说,系统本来只允许一个银行账户存取自己的钱,如果攻击成立,授权可以被放大,这个银行账户可以存取任何人的钱,然后再把银行的系统的记录抹平了。

    2021-01-18
    16
  • Lorin
    老师,我有两个问题: 1、长度延展攻击中,补齐数据是怎么获取到的啊? 2、长度延展攻击后,原散列值和扩展数据的散列值肯定不一样,这样的话,接收者都已经知道收到的数据与原散列值不一致了,这个时候长度延展攻击有什么意义呢?

    作者回复: 1、补齐规则是公开的,固定的数据长度,它的补齐数据是固定的。只要知道数据长度,得到补齐数据也就没有什么难度了。 2、接受者会重新计算散列值,然后对比攻击者附带的散列值,而不是保存一份散列值在本地。重新的计算散列值和附带的散列值是不是相同,才是要做的对比。

    2020-12-02
    3
  • Reol
    老师我还有个小问题,发送者是否要公开自己的加密算法? 按理说没有公开加密算法的必要,那么接收者不知道加密算法什么都做不了,不知道分组大小和压缩函数的固定处理位数,无法反推每个分组的输出向量,也不知道补充数据的格式。最重要的是没有算法无法自己计算延长数据的散列值。

    作者回复: 密码学的世界里,使用公开的加密算法要比使用不公开的算法更安全,没有必要使用不公开的加密算法。 请参考专栏里相关的讨论。

    2021-08-06
    2
  • qinsi
    疑问:补齐数据应该是由数据长度决定的,那么在不知道机密数据 S 的长度的情况下,攻击者要如何知道该补多长的数据?跟 S 在前或在后有关吗?

    作者回复: 很多场景下,机密数据的长度都是固定的。另外,即使不知道长度,也可以一个字节一个字节的猜,不过是猜几十还是几百/千/万次的问题。猜中一次,以后就知道了。

    2020-12-02
    2
    2
  • Reol
    老师我有两个小问题,求解答!!!!!! 假设:S私密,M公开,N延长 1. 关于长度延展的理解:对于散列值 h(S|M),因为可以根据终结函数的顺序输出,来推断出每个原文分组的压缩函数的输出。所以延长实际上的操作是,推断提取出散列值 h(S|M) 中最后一个分组的压缩函数输出向量,将其作为初始向量来运算散列值 h(N),然后直接拼接两个散列值 h(S|M) + h(N) = h(S|M|N),结果就是消息S|M|N的散列值 ,这样理解对吗? 2. 按照我对专栏原文还有配图的理解,在延长攻击中原文 S|M 后面要加上补充数据 (假设为m),然后再加上N和其补充数据 n。这样得出的 h(S|M|N) 实际上是 h(S|M|m|N) 对应的原文应该是 S|M|m|N 而不是 S|M|N,所以验证时是把原文 S|M|Bm|N 和 h(S|M|m|N) 发给S的持有者来验证。但这样S的持有者获得的原文里面M和N中间多了一段意义不明的m,S的持有者不会觉得奇怪吗?

    作者回复: 我没有理解#1中拼接的意思。延展攻击中,延展后的数据是(M | N). 如果我们把M记做M'= M | N, 那么h(S|M') = h(S|M|N). #2,N是构造的数据,已经包含了补充数据了。如果你想要单独标记补充数据和不弃数据,也没有问题。N = m + n. 会不会觉得奇怪这个问题,你可以参考文中罗列出来的适用场景,看看有哪些场景会奇怪,那些不会奇怪,那些没能力奇怪。

    2021-08-06
    1
  • godliness
    你能不能找到一些场景,可以让我们不用担心原始的散列值被更改,单纯使用单向散列函数就可以校验数据完整性? 老师,TLS 中的数字签名算不算呢?

    作者回复: 不算的,TLS的数字签名还使用了除单项散列函数以外的算法。

    2023-10-25归属地:湖北
  • godliness
    老师,上面 S 和 M 在防伪领域是不是经常用到?

    作者回复: 不太了解防伪领域怎么使用S和M的。

    2023-10-24归属地:湖北
  • Ankhetsin
    老师,md6和国密sm系列算法怎么样?

    作者回复: 如果时机合适的话,我会找个时间聊聊SM。

    2022-01-08
  • 木头发芽
    引用问题: "散列值的计算是公开的,给定一段数据,谁都可以计算它的散列值。如果数据可以被修改,而且给定的散列值也是修改后的数据的散列值,这个数据完整性校验是没有意义的。" 方案: 给数据+盐后计算散列值, 这个盐是一定规则生成不在网络上传输的,如果攻击者替换了数据和散列值,但因为不知道盐值,跟验证者生成的散列值不一致,就知道数据被串改, 该方案是否可行?

    作者回复: 规则不会泄漏吗?

    2021-05-21
  • bugs
    老师好, 散列算法的数据分组是连序性的吗?如果是的话,链接模式能保证靠前的数据块修改后的雪崩效应,不能保证靠后数据块修改的雪崩效应。

    作者回复: 没明白这个结论怎么来的。

    2021-03-30
    2
收起评论
显示
设置
留言
23
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部