极客时间-实用密码学-5如何有效避免长度延展攻击

什么是长度延展攻击

假设我们有两段数据S和M以及单向散列函数h,其中S是机密信息。我们通过hash=h(S+M)(其中+,表示字符串连接)计算hash值,通过计数数据的hash与原始hash对比来校验数据是否可靠。因为通常攻击者不知道S值。
比如如下字符串(可以看作url的一部分):


key_id=44fefa051fc1c61f5e76f27e620f51d5&perms=read&hash_sig=38d39516d896f879d403bd327a932d9e

hash_si=h(key|perms)

在上面种情形下就存在长度延展攻击,攻击者可以在不知道key的情况下构造出如下字符串:


key_id=44fefa051fc1c61f5e76f27e620f51d5&perms=read\0x80\0x00...\0x02&delete&hash_sig=a8e6b9704f1da6ae779ad481c4c165a3

这是如何做到的呢?

这跟单向散列函数的计算过程密切相关,下图表示单向散列函数的计算过程:
单向散列函数计算过程
输入数据进过分组,压缩函数接收一个数据分组和上一个压缩函数的运算结果。如果知道了上一个压缩函数的运算结果,我们就能够计算下一个分组数据的压缩函数运算结果。这里,就是出现安全漏洞的地方。

我们把原来的散列值作为压缩函数的一个输入,我们再按照数据补齐规范,去补齐原来数据到数据分组的整数倍,然后加入新的数据,我们就可以计算原数据和扩展数据的散列值了。

但是,如果我们把数据编排顺序换一下,把公开信息 M 放在前面,机密信息 S 放在后面,长度延展攻击就不起作用了。因为我们在重新验证url是否有效时采用的是hash=h(M|S),而再通过上面的方法只能构造hash=h(M|S|N),显然导致hash不匹配。这就是数据编排顺序对数据安全性的影响。

怎么有效避免长度延展攻击

一个单向散列函数如何使用了上述的压缩函数和链接模式,都是长度延展攻击的可以对象。

长度延展攻击完全有效的算法有:

  • MD2
  • MD5
  • SHA-0
  • SHA-1
  • SHA-256
  • SHA-512

长度延展攻击不是完全有效:

  • SHA-224
  • SHA-384

长度延展攻击没有效果:

  • SHA-512/224
  • SHA-512/256
  • SHA-3

我们要从中学会、理解一个实用的经验:不要单纯使用单向散列函数来处理既包含机密信息、又包含公开信息的数据。即使我们把机密信息放在最后处理,这种使用方式也不省心。

如果我们需要使用机密数据产生数据的签名,我们应该使用设计好的、经过验证的算法,比如我们后面会讨论的消息验证码(Message Authentication Code)和基于单向散列函数的消息验证码(Hash-based Message Authentication Code)。

有哪些典型的适用场景

单向散列函数是密码学的核心,典型使用单向散列函数的场景有:

  • 校验数据完整性
  • 数字签名,和非对称密钥及其算法结合使用
  • 消息验证码,和对称密钥及其算法结合使用
  • 生成伪随机数
  • 生成对称密钥

校验数据的完整性时,要保证给出的hash值不可更改,这样通过计算数据的hash值与原hash对比才有意义。比如:劫持者篡改了数据,同时计数篡改后数据的hash值并替换原始hash值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值