网工干货知识

超全学习笔记
当前位置:首页 > 干货知识

MD5算法到底是什么?

更新时间:2026年03月27日   作者:spoto   标签(Tag):

MD5就是如此而已。加密哈希函数这是一种算法,它可以将任意长度的消息作为输入,并将其转换为长度为16字节的固定长度的消息。MD5算法就是这种算法的名称。消息摘要算法MD5算法是由1991年开发的。罗纳德·里维斯特作为对MD4的改进,它具有更先进的安全性特性。MD5的输出结果(即摘要长度)始终保持不变。128位。MD5仍然是非加密功能中最常用的消息摘要算法。它被用来作为校验和,以验证数据的完整性;同时,它还可以将大文件安全地压缩成较小的文件。

MD5算法的概述

MD5算法的运作原理

MD5算法遵循以下步骤:

附加填充位:在第一步中,我们在原始消息中添加了填充位,使得消息的总长度比512的精确倍数少64位。

假设我们接收到的消息长度为1000位。现在,我们需要在原消息的基础上添加填充位。在这里,我们将在原消息中添加472个填充位。经过添加填充位之后,原消息的大小就变成了1472位,这比512的精确倍数少了64位(即512×3=1536)。

长度(原始消息长度加上填充位的数量)= 512 * i - 64其中,i = 1, 2, 3…
一次MD5运算

2. 附加长度位:在这一步中,我们将第一步的输出结果中的长度位添加进去,使得总位数能够成为512的完美倍数。简单来说,就是在第一步的输出来加上一个64位的数值作为长度位。

第一步的输出结果 = 512 * n – 64
长度位数 = 64。

在添加了两者之后,我们将得到以下内容:512 * n也就是说,它是512的精确倍数。

3. 初始化MD缓冲区:在这里,我们使用4个缓冲区,分别是A、B、C和D。每个缓冲区的容量都是32位。

A = 0x67425301
B = 0xEDFCBA45
C = 0x98CBADFE
D = 0x13DCE476
F、G、H和I函数

4. 处理每个512位的数据块:这是MD5算法中最重要的一步。在这一步中,总共会进行4轮操作,每轮都包含16次操作。在第一轮中,会执行16次操作;第二轮中,也会执行16次操作;第三轮中同样会执行16次操作;而第四轮则再次执行16次操作。在每一轮中,我们都会使用不同的函数来进行计算。具体来说,第一轮使用F函数,第二轮使用G函数,第三轮使用H函数,第四轮则使用I函数。
我们使用OR、AND、XOR和NOT这些逻辑门来进行计算。对于每个函数,我们都会使用3个缓冲器,分别命名为B、C、D。

处理过程P操作

在应用了该函数之后,我们需要对每个块进行相应的操作。为了执行这些操作,我们需要……

  • 加上模2的结果32
  • M[i] – 32位消息。
  • K[i] – 32位常量。
  • <<<n – 向左移位 n 位。

现在,将输入的数据视为初始化MD缓冲区中的数值,即A、B、C、D。B的值会被送入C中,C的值会被送入D中,而D的值则会被送入J中。完成这些操作后,我们再进行一些运算,以得到A的输出结果。

  • 在第一步中,先取B、C和D的输出结果,然后对这些结果应用函数F。最后,我们将结果进行模2运算。32  使用A来生成该输出的比特数。
  • 在第二步中,我们将第一步得到的输出结果与M[i]位消息相加。
  • 然后,将32位常数K[i]加到第二步的输出结果上。
  • 最后,我们执行左移操作,移位量可以是任意的n值。然后,再执行模2加法运算。32.

在完成所有步骤之后,A的结果将被输入到B中。现在,对于函数G、H和I来说,同样需要执行相同的步骤。经过这64个操作之后,我们就能得到消息的摘要了。

输出结果:

在所有轮次完成后,缓冲区A、B、C和D中存储的正是以最低位A开始、以最高位D结束的MD5哈希值。

MD5算法的实现

C++
// 导入所需的库文件#include<iostream>#include<iomanip>#include<openssl/md5.h>#include<cstring>// 生成一条消息标准::字符串输入字符串=“这是一位计算机用户发送的消息。”;// 使用库函数对消息进行编码处理无符号的字符/字母消化[MD5算法的摘要长度];MD5((无符号的字符/字母*)输入字符串.c_str(),输入字符串.长度(),消化);// 打印哈希函数的结果标准::cout<<“输入字符串的哈希值”<<标准::结束;为了(整数i=0;i<MD5算法的摘要长度;i++){标准::cout<<标准::十六进制<<标准::setw(2)<<标准::设置填充内容(‘0’)<<(整数)消化/理解[i];}标准::cout<<标准::结束;
C
// 导入所需的库文件#include<stdio.h>#include<string.h>#include<openssl/md5.h>整数主要/核心(){// 生成一条消息无符号的字符/字母消化/理解[MD5算法的摘要长度];字符/字母输入字符串[]=“这是一位计算机用户发送的消息。”;// 使用库函数对消息进行编码处理MD5((无符号的字符/字母*)&输入字符串,strlen(输入字符串),消化/理解);// 打印哈希函数的结果printf(输入字符串的哈希值:\n");为了(整数i=0;i<MD5算法的摘要长度;i++){printf(“%02x”,消化/理解[i]);}printf("\n");返回0;}
Java
// 导入所需的库文件进口java.security.MessageDigest;进口java.security.NoSuchAlgorithmException;公共的 主要/核心{公开的静态的无效/无意义主要/核心(字符串[]参数/变量){// 生成一条消息字符串输入字符串=“这是一位计算机用户发送的消息。”;尝试{// 使用库函数对消息进行编码处理MessageDigestmd=MessageDigest.getInstance(MD5);md.更新/补充(输入字符串.getBytes());字节[]消化/理解=md.消化();// 打印哈希函数的结果系统/体系.出去.println(“输入字符串的哈希值”);StringBuilderhexString=新的StringBuilder();为了(字节b:消化/理解){字符串十六=整数.转换为十六进制字符串(0xff&b);if(十六进制.长度()==1)hexString.附加(‘0’);hexString.添加/附加(十六);}系统/体系.外出/离开.println(hexString.转换为字符串());}捕捉(该算法不存在/无法使用e){e.打印错误日志();}}}
Python
# 导入所需的库文件进口 hashlib# 发送消息输入字符串 = “这是一位计算机用户发送的消息。”# 使用库函数对消息进行编码处理输出结果/内容 = hashlib.MD5(输入字符串.编码())# 打印哈希函数的计算结果打印(“输入字符串的哈希值”)打印(输出结果/内容.摘要/总结()))

输出结果/内容
Hash of the input string:922547e866c89b8f677312df0ccec8ee

MD5算法的应用

  • MD5被用作校验和,用于验证文件和数据的完整性。通过将原始文件的哈希值与收到的文件哈希值进行比较,可以判断文件和数据是否发生了更改。
  • MD5被用于数据安全性方面。加密例如:数据库中用户的密码以及那些不敏感的数据。
  • 它被用于版本控制系统,用于管理文件的各个版本。
  • 它最初被用于数字签名和证书中,但由于……漏洞/缺陷它已经被更安全的算法所取代,比如SHA-256。

MD5算法的优点

  • MD5的运算速度更快,而且更容易理解。
  • MD5算法可以生成长度为16字节的强密码。所有的开发者,比如网页开发人员等,都会使用MD5算法来加密用户的密码。
  • 为了整合MD5算法,需要相对较小的内存空间。
  • 生成原始消息的摘要信息非常简单且快捷。

MD5算法的缺点

  • MD5对于不同的输入,会生成相同的哈希值。哈希冲突). 
  • MD5的安全性非常低。SHA1SHA256以及其他现代加密算法。
  • MD5被认为是一种不安全的算法。因此,我们现在不再使用它了。SHA256而不是使用MD5。
  • MD5既不属于对称算法,也不属于非对称算法。

现代密码学中,MD5的替代方案

由于MD5存在漏洞,因此现在在现代应用中通常会使用一些更安全的加密哈希函数。

  1. SHA-256(安全哈希算法,256位长度)它属于SHA-2系列算法的一部分,能够生成256位的哈希值。该算法被广泛用于区块链、SSL证书、数字签名以及各种认证中。
  2. SHA-3它提供了一种替代SHA-2的解决方案,其内部结构有所不同,因此更能抵御某些类型的攻击。虽然SHA-2仍然更为常用,但SHA-3则被用于那些需要最高级别加密安全性的应用中。
  3. RIPEMD-160它会产生一个160位的哈希值,其安全性优于MD5,不过它的使用范围不如SHA-2那么广泛。它有时被用于特定安全系统中的数字签名和证书中。
  4. 漩涡/旋涡这是一种用于实现高安全性的加密哈希函数,其生成的哈希值长度为512位。它特别适用于那些需要极高安全性的场景。
              马上抢免费试听资格
意向课程:*必选
姓名:*必填
联系方式:*必填
QQ:
思博SPOTO在线咨询

相关资讯

即刻预约

免费试听-咨询课程-获取免费资料