哈希长度拓展攻击

原理

MAC算法(Message authentication codes (MACs)一般是为:md5(salt+data)

哈希摘要算法,如MD5、SHA1、SHA2等,都是基于Merkle–Damgård结构。当知道hash(salt+data)的值及salt长度的情况下,可以轻松推算出hash(salt + data+padding+m)。m是任意数据,可以为空,padding是salt后的填充字节。hash的padding字节包含整个消息的长度,因此,为了能准确计算出padding的值,salt的长度我们也是需要知道的。

当我们填充后,服务器算出的原始hash值,正好与我们添加扩展字符串并覆盖初始链变量所计算出来的一样。这是因为攻击者的哈希计算过程,相当于从服务器计算过程的一半紧接着进行下去。

影响范围

  • 受影响哈希:
    MD4、MD5、RIPEMD-160、SHA-0、SHA-1、SHA-256、SHA-512、WHIRLPOOL等
  • 无影响哈希:
    MD2、SHA-224和SHA-384

MD5算法的流程:

  1. 把消息分为n个消息块。
  2. 对最后一个消息块进行消息填充。
  3. 每个消息块和一个输入量做运算,把运算结果作为下一个输入量。

MD5算法的实现:

  • Append Padding Bits(填充bits)
  • Append Length(填充长度)
  • Initialize MD Buffer(初始化向量)
  • Process Message in 16-Word Blocks(复杂的函数运算)

而要实现我们的攻击,我们只关心前三步,也就是不用纠结复杂的算法运算。

利用工具

  1. HashPump(需要原始数据)

下载地址:

1
https://github.com/bwall/HashPump

可以python扩展,所以在python2下安装hashpumpy后直接使用

1
2
3
>>> import hashpumpy
>>> help(hashpumpy.hashpump)
>>> hashpumpy.hashpump("addc8b6f2825f30b36d0684789d052ba","lingwu","lingwuTest",16)
  1. hexpand (不需要原始数据)
1
https://github.com/amlweems/hexpand

修复方式

  1. 使用HMAC方式。
  2. 置换盐值与data,如 hash(data+secret)