news 2026/8/28 6:11:15

还在纠结MD5是加密还是散列?Python实现秒懂,真相扎心了

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
还在纠结MD5是加密还是散列?Python实现秒懂,真相扎心了

MD5(负5), 它属于一种被广泛运用的信息摘要算法, 该算法于1992年由美国密码学家罗纳德·李维斯特初次提出。

为什么, 有人觉得是那种能够用以加密的, 而有人却觉得是散列, 究竟为什么?

MD5到底是什么?

那么, MD5算法究竟是什么呢? 我们能够把MD5算法视为一台处理机器, 能够把计算机里任何的数据放进这台机器中。之后经此机器处理之后, 便会产出一个固定长度是128比特的MD5加密的值。传入这台机器的可以是字符串, 也能够是一张图片, 还能够是一段视频。

能瞧出来, 上面的这般操作, 是一种典型的哈希函数样式的操作模式, 它能够把任意的数据内容转化成一个拥有固定长度的散列值, 对于同一个输入而言, 所获得的输出结果一直是相同的, 并且不同的输入, 所得到的输出结果同样也是一样的。

依据这样的特性, 我们能够借助它去验证一个文件是不是被修改过了, 或者能够借助它来达成用户登录操作用户名以及密码的计算等等。

然而, 就是这么一个被普遍运用的加密算法, 却被人证实已然不再具备安全性了。这究竟是何种状况呢?

MD5到底做了什么?

怎么会出现MD5算法明明已被证实不再具备安全性了, 然而却依然存在许多人在运用的情况呢, 这就得从MD5算法的原理开始说起了。

MD5算法生成一个MD5的值,可以分为三个步骤。

填充对齐

我们清楚, 于计算机里所存储的数据, 最終皆是以二进制的由0和1构成这样的方式去运行存储的。那么, 当我们得到一个数据之后, 第一步要展开的事情便是针对数据开展补齐。

举个例子, 假设我们获取到了715个Bit的数据, 在这个时候, 就需要把它补齐成为512的整数倍数, 在这里我们发现距离较近, 那么, 就需要补上309个Bit, 使其达到要求。然后在用于补齐的数据里, 最后的64Bit是用来表示原始数据大小的。中间剩余的位置从原始数据开始计算, 第一个位置填1, 其余位置全部为0。

固然存在一种情形, 假定, 原始数据的大小已然逼近了作为特定关键数值的1024, 在这样的时刻事实上是无法去填充用以表述原始数据大小的64个Bit的, 那么面对这种状况究竟要如何去处理? 那么处于这个时间节点, 就必须把它补充完整至紧接着的下一个512的倍数, 这也就是所提及的, 随后还要依据上述阐明的方式去进行补充操作。

也就是讲随便最终结果数据体量究竟是多大, 只要没办法确保符合上述条件, 那么就得作补足处理, 哪怕得到的数据刚好就是5的整数倍倍数, 依旧得做前述操作。补足完毕后, 就展开第二步操作也就是分块。

分块

经由数据补齐举动使得数据成为能够被512整除的完整倍数, 进而必然一定能够把这些数据按照512的大小划分成为若干份数据块, 而后发现MD5值最终的呈现是一种固定的大小, 有一位编写者把这128个Bit划分成了四个部分段界, 并且凭借幻数给这些分别的四个部分赋予了初始的数值。

为什么是幻数呢?原因很简单就是为了让你猜不到。

这样分块也就完成了。接下来就是多轮压缩了。

多轮压缩

通过上面所做的操作, 我们能够把数据最终划分成两个大的部分, 并且我们会把其中一个大的部分数据取出来, 和上面的四个分块的值, 这里以标记位A、B、C、D四个值为准, 接着分别用这四个值和数据块各自进行一系列的或与非以及移位运算。整个这个过程一共开展四轮。然后每一轮压缩操作完成之后, 就需要分别去更新A、B、C、D的值, 如此一来经过四轮计算之后四个值总共被更新了十六次。

实施完压缩操作以后, 便把数值A、数值B、数值C、数值D依照顺序归位到最初设定的原处之上, 在这个特定时刻散列值就达成了更新操作并宣告结束。

之所以这个过程被称作是压缩, 事实上就是把存在的数据变成了四个位置里的某一个位置, 以由512至128的变化, 信息被进行了压缩。所以整个这样的过程被叫做是压缩。

而后, 继续运用第二个大块, 去重复上述所开展的工作, 在这个时候, 唯一存在不同之处的便是, 那四个数据值已然变成了第一个大块数据经过计算之后所得出的结果。

若后续存在诸多的大块数据, 那么操作与上面所进行的操作并无二致, 是相同的。

当我们将所有数据的压缩操作给完成了, 那么散列值就被更新成了最终的结果。整个MD5加密算法的实现过程是有点复琐碎的, 但是理解起来并不是太是复杂。即使使用比较复杂的面向对象的编程语言也可以凭借其以能够在百行代码之内实现它那个它这。

由于我们已经清楚了MD5算法的实现细节, 所以紧接着我们就要去瞧瞧MD5究竟是怎样被攻克的?

MD5是如何被攻破的?

在着手展开攻击以前, 首先需要弄明白的关键要点便是攻击的目标究竟是什么, 不然的话攻击就会缺乏应有的意义。依据上面所做的分析, 我们能够明确获知MD5乃是一个用于生成MD5值的计算函数, 而并非是针对数据做了加密处理。所以说对于MD5的攻击行为, 实际上并非是借助一个密钥来实施解密操作。

这个理解起来并不困难, 密文能够成为密文, 必然是在信息没有损失的前提之下, 要是存在信息损失那么便无法从密文当中获取到明文了。显而易见MD5并非如此这般。

从宏观层次来观察, 在MD5加密之后, 原本体积为500M的数据居然最终被压缩成了仅仅128个Bit, 而后你居然试图凭借这些去恢复那500M的数据, 简直是荒谬至极,只有傻子才会相信如此行径是合理的呢!从微观层面来深入考量, 很显然这是毋庸置疑的, 在我们着手进行补齐操作、分块操作以及后续的数据压缩操作的整个进程当中, 数据信息自身已然被明显改变了, 这就表明显然是根本无法直接实施恢复的数据。而这一状况也就致使MD5值的生成过程成为了一个完全不可逆的过程。

那么我们还攻击个啥呢?

破解MD5的秘密?

在上面, 我们已然清楚, MD5值是借由一个消息数据予以计算而得的, 并且于数学范畴之中, 我们同样清楚, 要是呈现为一个标准的一次函数f(x)=x这般形式的话, 那么一个x便对应着一个y的值, 也即是说, 一个消息也就对应了一个独一无二的MD5的值。

假定, hello所对应的MD5值是这般, 那即意味着, 在hello保持不变的情形下, MD5的值同样是不会产生变化的。然而, 真的是如此状况么?

我们上面提及的是, 任意的输入, 都会获取到一个唯一的输出, 实际上, 这句话包含着两个限定条件。

在数学概念方面来讲, 假设存在100个房子, 这意味着MD5值被穷举了, 有500个人, 显然会出现多个人住一个房子的情况, 很明显, 一个MD5的值能够对应多个输入的结果!

如此这般, 先前我们所假定的f(x)=x的函数操作, 那便是存在问题的。既然已然出现了哈希冲突, 在MD5里被称作是碰撞, 既然无穷对于有界而言, 那对应的无穷理应是有无数个的.只是, 鉴于数据处理方面的缘由, 我们没办法寻找到引发碰撞的数据而已。起码作者于设计MD5之际, 或许尚未考虑到这一点。

所以显然就不存在通过MD5值进行逆向的操作了。

既然存在一个MD5对应着无穷无尽的消息, 那么我们能不能找到一个, 或者能穷举出来几个可以产生如此MD5值的消息呢? 很明显, 这仅仅在理论层面是可行的。然而在实际操作当中, 这是行不通的, 穷举是一项根本无法完成的操作, 毕竟数量级摆在那里, 是2的128次方, 这就如同大海捞针一般。

真的没有办法了么?

是不是就没有办法了呢?

假设, 我们已然给定, 一个消息, “Hello World!”, 那么, 它所对应的MD5值, 我们是能够知道的。那么, 我们可不可以, 再去寻找到, 另外的一个, MD5值与之相同的数据呢? 在MD4中, 面对一些弱口令的时候, 这种方式, 是可行的, 但是, 在MD5中, 这种方式, 还是存在着, 些许难度的。

其实让MD5破防的真正原因其实是下面的这个操作。

实验室给出的破解方式?

我们没必要给定MD5值, 也没必要去找出呼应的消息, 我们仅是要拟定个规则, 而此规则便是能借由两条消息, 生成同一个MD5就行。那么在此情况下, 操作就得以大为简化了。譬如一个二次函数就会出现两个X值对着一个Y值的状况啦!我们不用找出无数个, 只需找出两个便行了。当然了这只是个简易的例子。

那么如何是实现这个操作呢?

十分抽象, 跟生成MD5值的历程相较, 此过程看似简易, 实际上极为繁杂。事实上这同样会成为信息安全范畴的一项关键, 破除这个规则往往要比制订这个规则复杂许多许多。

当然, 上面所进行的操作, 仅仅是在实验室所给出的操作范畴内。然而, 从真实的工程使用场景这个角度去审视, 这般的方式究竟具备怎样的用途呢?

虽然能够找寻到最终的碰撞值, 然而这个碰撞值乃是借由差分路径以及消息的修改才得以获取的, 所以讲, 最终所获得的值仅仅只是一个值而已, 在工程方面并没有实际的用途, 可是事实却并非这般。

到此为止,我们知道MD5已经不再安全了,

MD5安全问题利用

假定, 借由选取前缀的方式, 造就了两个MD5值一样, 然而执行成效全然不同的软件, 此时, 经MD5检验之后并不会发觉两个文件存在什么异样, 可是你在做选择之时, 恰好就选中了那个带有木马病毒的文件, 此际, 就会出现安全方面的问题了。

假设存在这样一种情况, 张三与李四, 将MD5用作某个关键文件的真伪验证手段, 那么显而易见, 借助选择前缀的办法, 张三能够预先制作出两个MD5值相同的文件, 如此一来这两个文件的内容全然不同, 然而MD5值却相同, 最终导致的结果便是被骗了?

那么什么是选择前缀呢?

说起来要是去理解, 事实上是特别容易明白搞懂的, 去细细查看上面所列举的内容, 我们由此就明确知晓了, 假若是一个文件倘若它的大小真真恰好是512这种情况的话, 那么很明显能够看得出来说, 是需要去开展补齐操作的, 在这个时候依照相应的规则, 当补齐完成之后, 文件后面跟着的内容恰恰就是一串没有任何实际意义的文件。那么究竟应该怎样去使得这个文件能够产生出一个和MD5值一模一样的其他文件呢?

借助上面那种方式, 我们能够晓得, 于大批量数据里去寻觅碰撞存在一定难度, 不妨使我们让文件内容保持一致,仅让其中一部分数据产生变化。如此一来能够轻易找寻到碰撞, 此情形有点类似于, 我们把一个函数的定义域予以缩小了, 这般在这个小范围的定义域里面找寻到一个碰撞值会变得很简单。

总结

篇幅很长的文章, 相信看到这儿时, 或许会觉有点迷糊了!然而若能认真将其看完, 肯定会对你理解MD5算法有帮助的。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/28 6:09:59

从零构建全栈旅游小程序:Spring Boot + 微信原生 + Vue 3 实战架构

简介:全栈开发涉及前端、后端与数据库的协同构建,是现代软件工程的核心实践。其原理在于通过清晰的技术分层与模块化设计,实现高效的数据流转与业务逻辑处理,从而提升开发效率与系统可维护性。在技术价值上,成熟的全栈…

作者头像 李华
网站建设 2026/8/28 6:09:26

Matlab神经网络工具箱实战:构建多输入多输出预测模型

1. 项目概述:从“黑箱”到“利器”的神经网络工具箱实战在数据驱动的时代,无论是预测股票走势、分析用户行为,还是优化工业流程,我们常常面临一个核心问题:如何从一堆看似杂乱无章的多维输入数据中,精准地预…

作者头像 李华
网站建设 2026/8/28 6:07:21

AI参与创造时任务意义感为何下降?机制拆解与工程应对

当 AI 做了“创意”,人为什么突然不想努力了?任务意义感流失的机制拆解与工程应对在最近的 AI 协作实践中,我反复遇到一个很有意思的现象:同一份需求文档,如果由我手动梳理并写出初版方案,我会很投入地反复…

作者头像 李华
网站建设 2026/8/28 6:06:44

基于海光DCU的AI音乐翻唱全流程落地实战

随着AI语音转换技术快速迭代,AI音乐翻唱已成为音频创作、自媒体内容生产的主流方案。传统AI翻唱大多基于NVIDIA CUDA显卡开发部署,在国产算力生态普及的当下,海光DCU(深度学习计算单元)凭借国产化、高算力、高兼容性优…

作者头像 李华
网站建设 2026/8/28 6:02:19

Photo to Video AI + Motion Prompt:让静态照片动起来的关键技巧

先想一个场景。你手里有一张人物照片,想让它微笑、眨眼、转过头来。放在五年前,这意味着你需要学一套动画管线:先抠图、再建模、绑定骨骼、打关键帧、调补间,最后还要处理脸部纹理在运动时崩坏的问题。放在现在,这张照…

作者头像 李华
网站建设 2026/8/28 6:00:40

LLM Agent故障实时检测与自动修复实战指南

最近在做大模型 Agent 相关项目时,最让人头疼的往往不是模型能力不够,而是 Agent 在真实运行中频繁出现各种意外失败:工具调用参数解析不了、外部 API 超时、上下文窗口被撑爆、重试多次依旧卡死……更麻烦的是,这些失败通常要等用…

作者头像 李华