MD5加密
生成文本的MD5哈希值,用于数据完整性验证
结果
关于MD5
MD5(信息-摘要算法5)是一种广泛使用的加密哈希函数,可生成128位(16字节)哈希值,通常表示为32位十六进制数。它由罗纳德·李维斯特(Ronald Rivest)于1991年设计,用于替代早期的MD4算法,并于1992年4月在RFC 1321中正式规范化。
尽管存在安全漏洞,MD5仍被广泛用于非安全应用,如校验和,以验证数据完整性并检测意外的数据损坏。由于其计算需求低于较新的安全哈希算法,它在非密码学用途中仍然适用。
<strong>安全提示:</strong> MD5不适用于对安全性要求高的应用,如密码存储、SSL证书或数字签名,因为它容易受到碰撞攻击。自2008年起,CMU软件工程研究所将MD5视为"密码学上已破解且不适合继续使用"。
历史与算法
MD5由麻省理工学院的罗纳德·李维斯特教授设计,作为MD4的更安全替代品。该算法接收任意长度的输入消息并产生128位的"指纹"或"消息摘要"作为输出。MD5算法设计在32位机器上运行迅速,且不需要大型替换表,允许紧凑实现。
该算法通过将输入分解为512位的块,将可变长度消息处理成128位的固定长度输出。它在由四个32位单词(A、B、C和D)组成的128位状态上运行,并通过四轮操作,每轮执行16次基于非线性函数、模加法和位旋转的操作。
算法伪代码
// 初始化变量 A = 0x67452301 B = 0xEFCDAB89 C = 0x98BADCFE D = 0x10325476 // 准备函数 F(X,Y,Z) = (X AND Y) OR ((NOT X) AND Z) G(X,Y,Z) = (X AND Z) OR (Y AND (NOT Z)) H(X,Y,Z) = X XOR Y XOR Z I(X,Y,Z) = Y XOR (X OR (NOT Z)) // 处理消息(消息必须是512位的倍数) // 填充消息直至其长度 ≡ 448 (mod 512) // 添加64位表示原始消息长度 // 主循环 for each 512-bit chunk of padded message: // 将块分为16个32位字 (M[0..15]) // 复制块状态 AA = A BB = B CC = C DD = D // 第1轮 for i from 0 to 15: A = B + ((A + F(B,C,D) + M[i] + T[i]) <<< s[i]) 循环交换 A, B, C, D // 第2轮 for i from 16 to 31: A = B + ((A + G(B,C,D) + M[(5*i + 1) mod 16] + T[i]) <<< s[i]) 循环交换 A, B, C, D // 第3轮 for i from 32 to 47: A = B + ((A + H(B,C,D) + M[(3*i + 5) mod 16] + T[i]) <<< s[i]) 循环交换 A, B, C, D // 第4轮 for i from 48 to 63: A = B + ((A + I(B,C,D) + M[(7*i) mod 16] + T[i]) <<< s[i]) 循环交换 A, B, C, D // 添加块处理结果 A = A + AA B = B + BB C = C + CC D = D + DD // 输出 MD5 = A || B || C || D // 连接为128位结果
安全漏洞
1996年,MD5设计中发现了一个缺陷,但当时并未被视为致命问题。到2004年,研究人员发现了更严重的漏洞,并演示了实用的碰撞攻击——创建产生相同MD5哈希值的不同输入对的方法。
2008年,一组研究人员利用这些漏洞创建了看似合法的伪造SSL证书。2012年,Flame恶意软件利用MD5弱点伪造了微软的数字签名。现代碰撞攻击可以在标准计算机硬件上在几秒钟内找到MD5碰撞。
常见用途
- 文件完整性验证(比较校验和)
- 存储文件或数据块的唯一标识符
- 在存储系统中检测重复文件
- 在下载系统中进行文件验证
- 在安全性不是考虑因素的情况下进行数据库分区
示例
Input: "Hello, World!"
MD5 Hash: 65a8e27d8879283831b664bd8b7f0ad4
Input: "" (empty string)
MD5 Hash: d41d8cd98f00b204e9800998ecf8427e