1. MD5 是什么?
MD5(Message-Digest Algorithm 5)是一种哈希算法,它把任意长度的数据(如字符串、文件)转换成固定长度的 128 位(16 字节)哈希值,通常用 32 位十六进制字符串 表示。
示例:
import hashlib
md5_hash = hashlib.md5(b"hello").hexdigest()
print(md5_hash) # 输出:5d41402abc4b2a76b9719d911017c592
2. MD5 的特点
- 固定长度输出:不管输入多大,MD5 始终输出 32 个字符的十六进制字符串。
- 不可逆:无法从 MD5 哈希值反推出原始数据(不是加密,是摘要)。
- 雪崩效应:输入稍有变化,MD5 值完全不同。
hashlib.md5(b"hello").hexdigest() # 5d41402abc4b2a76b9719d911017c592 hashlib.md5(b"hello1").hexdigest() # 6f9b9af3cd6e8b8a73c2cdced37fe9f8
- 不唯一:不同数据可能生成相同 MD5(碰撞),但概率极低。
3. MD5 的常见用途
-
文件完整性校验
- 检查下载的文件是否被篡改(对比 MD5 值)。
- 示例(Linux):
md5sum filename.txt
-
缓存 Key 生成
- 用 MD5 哈希值作为唯一标识(如 Redis 缓存 Key)。
-
旧系统密码存储(已不安全)
- 早期系统存储密码的 MD5 值(现在不推荐!)。
4. MD5 的安全问题
- 碰撞攻击:可以人为制造不同数据生成相同 MD5(已被破解)。
- 彩虹表攻击:黑客预先计算常见数据的 MD5,反向查原始数据。
安全替代方案:
- 密码存储 →
bcrypt
、PBKDF2
、Argon2
(加盐+慢哈希)。 - 数据校验 →
SHA-256
、SHA-3
。
5. 代码示例(Python)
import hashlib
# 计算字符串 MD5
text = "hello"
md5_hash = hashlib.md5(text.encode()).hexdigest()
print(f"MD5: {md5_hash}")
# 计算文件 MD5
def get_file_md5(filename):
with open(filename, "rb") as f:
return hashlib.md5(f.read()).hexdigest()
print(get_file_md5("data.txt"))
6. 总结
- 能用 MD5 的场景:非安全用途(如缓存 Key、文件校验)。
- 不能用 MD5 的场景:密码存储、数字签名。
- 替代方案:
SHA-256
(安全)、bcrypt
(密码存储)。
一句话:MD5 适合快速计算哈希,但不安全,关键场景换 SHA-256!
评论区