CoderTools

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

参考资料与延伸阅读

相关工具