MD5(Message-Digest Algorithm 5)和SHA-1(Secure Hash Algorithm 1)是两种经典的密码学哈希函数,用于生成数据的固定长度“指纹”(哈希值)。尽管它们因安全性问题已逐步被淘汰(如SHA-256替代),但理解其原理对学习密码学仍有重要意义。以下是它们的核心原理解析:
一、哈希函数的共同特性
- 固定输出长度:无论输入多大,输出长度固定(MD5为128位,SHA-1为160位)。
- 确定性:相同输入始终产生相同哈希值。
- 单向性:无法从哈希值逆向推导原始数据。
- 抗碰撞性:难以找到两个不同输入产生相同哈希值(但MD5/SHA-1已失效)。
二、MD5算法原理
-
输入处理:
- 填充数据:将输入数据填充至长度 ≡ 448 mod 512(即比512的倍数少64位),填充方式为首位补1,后续补0。
- 附加长度:在填充后附加原始数据长度的64位表示(小端序)。
- 分块处理:将数据分割为512位的块(每块16个32位字)。
-
初始化缓冲区:
- 使用4个32位常量(A=0x67452301, B=0xEFCDAB89, C=0x98BADCFE, D=0x10325476)作为初始哈希值。
-
主循环(每512位块):
- 四轮运算:每轮对缓冲区(A,B,C,D)进行16次非线性操作(共64步),每步使用不同的逻辑函数(F, G, H, I)和常量表。
- 操作示例:
a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s)
,其中X[k]
为当前数据字,T[i]
为常量,<<<
为循环左移。 - 更新缓冲区:每块处理完后,将输出与初始缓冲区相加。
-
输出:最终拼接A、B、C、D的128位哈希值(16进制表示如
d41d8cd98f00b204e9800998ecf8427e
)。
三、SHA-1算法原理
SHA-1与MD5结构类似,但更复杂且输出更长(160位):
-
输入处理:
- 填充方式与MD5相同(长度 ≡ 448 mod 512),但附加长度为64位大端序。
-
初始化缓冲区:
- 使用5个32位常量(A=0x67452301, B=0xEFCDAB89, C=0x98BADCFE, D=0x10325476, E=0xC3D2E1F0)。
-
主循环(每512位块):
- 扩展数据:将16个32位字扩展为80个字(通过异或和循环左移)。
- 四轮运算:共80步,每20步使用不同的逻辑函数(f1, f2, f3, f4)和常量K。
- 操作示例:
temp = (a <<< 5) + f_t(b,c,d) + e + K_t + W[t]
,然后更新e=d, d=c, c=b<<<30, b=a, a=temp
。 - 更新缓冲区:每块处理后与初始值相加。
-
输出:拼接A、B、C、D、E的160位哈希值(如
da39a3ee5e6b4b0d3255bfef95601890afd80709
)。
四、安全性问题
-
MD5的缺陷:
- 碰撞攻击:2004年王小云团队提出高效碰撞算法(如不同文件生成相同哈希)。
- 实际案例:伪造SSL证书、恶意文件绕过校验。
-
SHA-1的缺陷:
- 2017年谷歌首次公开碰撞实例(SHA-1碰撞攻击成本已降至可实践水平)。
五、应用与替代方案
- 遗留用途:校验文件完整性(但需确保无恶意碰撞风险)。
- 现代替代:SHA-256、SHA-3(Keccak)或BLAKE3等更安全的算法。
关键区别
| 特性 | MD5 | SHA-1 |
|--------------|-------------------|--------------------|
| 输出长度 | 128位(16字节) | 160位(20字节) |
| 步骤数 | 64步(4轮) | 80步(4轮) |
| 安全性 | 已完全破解 | 已不推荐使用 |
| 速度 | 更快 | 稍慢 |
理解这些原理有助于深入密码学基础,但在实际应用中务必选择更安全的哈希函数。
(本文来源:nzw6.com)