MD5哈希长度延展攻击

长度延展攻击

长度延展攻击介绍

定义:长度延展攻击(Length Extension Attack)是一种利用哈希函数的漏洞进行的攻击,可以通过已知消耗部分的消息中继续拼接新的消息并生成另一个哈希的方法来伪造一个被认为是可信的哈希,并且不需要访问或了解原始签名密钥。

实现过程:

长度延展攻击的具体实现根据使用的哈希函数和攻击场景而不同,这里以MD5哈希函数为例进行说明。

MD5是一种广泛使用的哈希函数,其输入数据块大小为512位,并且支持可变长度的输入消息。利用长度延展攻击,攻击者可以在已知哈希值和消息内容的情况下,实现根据哈希值生成任意恶意消息。下面是一个针对MD5哈希函数的长度延展攻击的具体实现步骤。
  1. 攻击者拥有已知的哈希值和部分明文消息段。
  2. 攻击者使用已知的哈希值作为起点,计算哈希函数的内部状态。由于MD5哈希函数的内部状态是对每个512位数据块的压缩,因此攻击者需要对部分已知消息段进行填充,使其长度与512位数据块大小对齐,以重建MD5状态。
  3. 整个消息包括任意长度的填充字节和恶意数据。这些数据包括原始消息的余量和额外的恶意数据。攻击者构造这个新消息,在原始消息之后追加恶意数据,同时确保新消息的长度满足对齐条件。
  4. 通过向填充消息中追加伪造的数据块,攻击者可以计算在原始哈希值之后追加恶意数据的新哈希值。
  5. 攻击者使用新的哈希值,以及额外的消息作为有效贡献,实现对接收者的误导和攻击。
下面通过一个具体的例子,来说明MD5哈希函数的长度延展攻击的过程:
  1. 假设原始消息为:"hello world"(11字节),哈希值为:"5eb63bbbe01eeed093cb22bb8f5acdc3"
  2. 首先,攻击者使用该哈希值作为起点并计算出MD5的状态。
  3. 接下来,攻击者构造一个新的消息,并向其添加恶意数据。假设添加的数据为:" is vulnerable to length extension attack."
  4. 为了对齐新的消息,攻击者向消息中添加字节,直到它的长度满足512位数据块大小的要求。
  5. 攻击者使用填充后的消息数据、哈希函数状态以及恶意数据作为输入,计算新的MD5哈希值。在这种情况下,攻击者追加的数据恰好符合哈希函数的输入标准,直接计算即可。
  6. 攻击者使用新生成的哈希值和恶意数据来欺骗接收者,使锅炉内的后续操作受到影响。

结论:

在上述过程中,攻击者利用了MD5哈希算法的计算逻辑,并且利用其自身处理数据的方式进行欺骗。实际上,关于长度延展攻击的攻击路径是因具体的哈希函数而异,并且实际操作中也需要攻击者根据具体实现方式进行调整。然而,以上的例子说明了MD5哈希算法的漏洞,并展示了可以利用这些漏洞进行可利用的攻击的基本操作过程。

使用openssl库中的MD5_Update()函数来计算MD5哈希值,并手动添加填充数据以及新的命令进行攻击。以下是代码:

cCopy Code

#include <stdio.h>
#include <string.h>
#include <openssl/md5.h>

int main() {
    // 原始命令和签名
    char original_cmd[] = "cmd=viewfile";
    unsigned char original_signature[MD5_DIGEST_LENGTH]; // 存储签名的数组
    // 假设原始签名已知,这里用16进制表示
    sscanf("68617a652cf8ad912cef9bbbe8ddacf7", "%32x", original_signature);

    // 需要添加的命令
    char additional_cmd[] = "||padding||deletefile";

    // 计算新的签名
    unsigned char new_signature[MD5_DIGEST_LENGTH]; // 存储新签名的数组
    MD5_CTX ctx;
    MD5_Init(&ctx);
    MD5_Update(&ctx, original_cmd, strlen(original_cmd));
    // 添加填充数据
    MD5_Update(&ctx, additional_cmd, strlen(additional_cmd));
    MD5_Final(new_signature, &ctx);

    // 输出新的命令和签名
    printf("新的命令:%s\n", strcat(original_cmd, additional_cmd));
    printf("新的签名:");
    for(int i = 0; i < MD5_DIGEST_LENGTH; i++) {
        printf("%02x", new_signature[i]);
    }
    printf("\n");

    return 0;
}

这段代码通过计算MD5哈希值来构造新的签名,其中包括了填充数据和新的命令。最终输出新的命令和签名。

运行截图

posted @ 2024-04-14 22:48  尹子扬  阅读(93)  评论(0编辑  收藏  举报