首页 > 其他分享 >MD5哈希长度延展攻击(选做)

MD5哈希长度延展攻击(选做)

时间:2024-06-16 16:45:20浏览次数:9  
标签:选做 攻击 cmd 签名 哈希 攻击者 MD5

任务详情

任务描述:
在一个使用MD5哈希算法的系统中,管理员使用了一个密钥k和命令cmd的组合来生成每个命令的签名:hash(k||cmd)。你已经获得了一个允许查看文件的命令cmd=viewfile和对应的签名h,但你希望通过哈希长度延展攻击,生成一个新的签名,该签名能够让你执行删除文件的命令(删除文件的命令为rm)。
具体步骤:

  1. 研究MD5哈希长度延展攻击的机制,并找出适用于此场景的攻击方法。(3分)
  2. 使用合适的工具或脚本,基于cmd=viewfile和签名h,构造一个新的命令cmd=viewfile||padding||deletefile和新的签名。(6分)
  3. 提交你使用的攻击方法、工具或脚本的详细说明,以及成功构造的命令和新的签名。(6分)

长度延展攻击

长度延展攻击介绍

定义:长度延展攻击(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哈希值来构造新的签名,其中包括了填充数据和新的命令。最终输出新的命令和签名。

运行截图

标签:选做,攻击,cmd,签名,哈希,攻击者,MD5
From: https://www.cnblogs.com/hosf/p/18250825

相关文章

  • 6.14 哈希表
    采用邻接表创建无向图G,依次输出各顶点的度。输入格式:输入第一行中给出2个整数i(0<i≤10),j(j≥0),分别为图G的顶点数和边数。输入第二行为顶点的信息,每个顶点只能用一个字符表示。依次输入j行,每行输入一条边依附的顶点。输出格式:依次输出各顶点的度,行末没有最后的空格。输入......
  • 代码随想录第7天 |● 454.四数相加II●383. 赎金信●15. 三数之和●18. 四数之和●哈
    题目:454.四数相加Ⅱ思路:0.知道用map,但是map存啥1.暴力法,四层循环遍历哈哈哈哈2.分而治之,化繁为简,四个数组a,b,c,d分成两组,题目求符合要求的元祖个数,所以将a+b的值和出现次数存储,之后遍历查找c+d中0-(c+d)出现的次数,统计为结果时间复杂度:O(n^2)空间复杂度:O(n^2),最坏情况下A......
  • 代码随想录 算法训练营d7 哈希表 Leetcode454 四数相加2 Leetcode383 赎金信 Leetcode
    Leetcode454四数相加2 题目链接简单理解四个数组的数构成元组 相加为0思想:参考力扣第一题两数之和 才用哈希表解决问题通过将ab数组之和存储到哈希表中,并记录次数再通过计算-(c+d)去匹配哈希表如果存在那么count+=次数即可classSolution{publicintfour......
  • c++哈希表hash_table的深度学习(hash_map,un和hash_set的底层实现)
    什么是哈希表?哈希表(HashTable)是一种数据结构,它使用哈希函数将键(key)映射到桶(bucket)或槽(slot)中,可以直接通过相应的键值直接对数据进行访问,高效的插入,删除,查找 哈希表的组成部分和特性哈希函数:哈希函数接受一个键作为输入,并返回一个索引值(通常是一个整数),该索引值用于确定键......
  • 代码随想录第6天 | ●哈希表理论基础●242.有效的字母异位词●349. 两个数组的交集●2
    题目:242.有效的字母异位词思路:1.ASCII和哈希函数,存入数组,比较数组相等否2.首先选择数据结构,题目只有小写字母,ASCII连续,选用数组,一个字符串遍历,在哈希数组中存入字母出现频率,第二个字符串遍历,做减法。(不需要记ASCII,直接减字母,编译器自己算)时间复杂度:O(n)空间复杂度:O(1)坑......
  • MD5加密算法
    MD5加密算法目录MD5加密算法简介说明应用简介MD5(Message-DigestAlgorithm5)是一种被广泛使用的密码散列函数,它可以产生出一个128位(16字节)的散列值(hashvalue),用于确保信息传输完整一致。MD5并不是一种加密算法(因为它不可逆),而是一种摘要算法或哈希算法。以下是MD5加密(更准确地......
  • 【力扣真题】3.哈希表|算法真题程序设计数据结构考研保研复试机试面试秋招春招蓝桥杯
    242.有效的字母异位词给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。示例1:输入:s=“anagram”,t=“nagaram”输出:true示例2:输入:s=“rat”,t=“car”输出:false说明:你可以假设字符串只包含小写字母。力扣题目链接思......
  • 代码随想录 算法训练营 d6 哈希表 Leetcode242 有效的字母异位词 Leetcode349 两个数
    哈希表很重要哈希表哈希表场景一般哈希表都是用来快速判断一个元素是否出现集合里一般来说数组模拟哈希set 哈希map不同的场景 当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,se......
  • (算法)判断是否互为字符重排——<哈希表>
    1.题⽬链接:⾯试01.02.判定是否互为字符重排2.题⽬描述:3.解法(哈希表): 算法思路: 1.当两个字符串的⻓度不相等的时候,是不可能构成互相重排的,直接返回false;2.如果两个字符串能够构成互相重排,那么每个字符串中「各个字符」出现的「次数」⼀定是相同的。因此,我们可以......
  • 阅读习惯2(选做)
    1.参考书单https://weread.qq.com/misc/booklist/3107758_7sb8Fs2Hv,从中选择阅读,养成阅读习惯2.提交微信读书(或其他平台)目前的与上面书单有关的读书数据(总时长,册数,笔记数等)的截图3总结本学期的收获,新增的总时长,册数笔记等,谈谈本学期收获,养成良好的阅读习惯了吗?会一直坚持阅读......