Length extension attack

长度扩展攻击(Length extension attacks)是指针对某些允许包含额外信息的加密散列函数的攻击手段。简单来说,就是通过特殊的手段来扩展消息,可以伪造一个不经过私钥签名的Hash签名结果。

攻击条件

  1. 已知私钥和消息
  2. 采取了 H(密钥 ∥ 消息) 此类构造的散列函数

攻击效果

  1. 伪造消息签名

攻击场景

  1. API请求签名:MD5(Secret + k1,v1 + k2,v2 …) ,注意secret在前

原理

Merkle–Damgård construction的算法都受到影响,包括MD5、SHA1、SHA5等。
以MD5为例,假设我们有一个很长的消息需要签名,MD5不会将他们一次性就把结果计算出来,而是分成多个块,一块一块的计算,每个块固定是64个字节。
另外,如果我们的消息并不是刚好将一个块放满或者本身消息就少于一个块,MD5就会把消息填充,让它刚好填满整个块。详细填充的方法如下:

对消息进行填充(比特第一位为1其余比特为0),使之(二进制)补到448模512同余,即长度为512的倍数减64,最后的64位在补充为原来字符串的长度,这样刚好补满512位的倍数,如果当前明文正好是512bit倍数则再加上一个512bit的一组。

https://err0rzz.github.io/2017/09/18/hash%E9%95%BF%E5%BA%A6%E6%89%A9%E5%B1%95%E6%94%BB%E5%87%BB/

MD5将每个块计算完结果后,会将结果作为下一次计算的初始向量,而这个也是当前消息体的MD5值。

所以我们可以在已知一个消息MD5结果的情况下,来填充一些数据,并能伪造出正确的Hash签名。

如:我们已知md5(‘xxxxxx,admin,admin’) = hash1, 可以计算出md5(‘xxxxxx,admin,admin’+paddingMsg + data) 的hash值,其中data是我们任意想要添加的消息内容。

发表评论

电子邮件地址不会被公开。 必填项已用*标注