02 哈希函数(Hash Functions)
Domain 3 · 把任意长消息压成定长”指纹”,只保完整不保密
一句话秒懂
哈希 = 给数据生成一段固定长度、唯一、不可逆的”指纹”(message digest)。改一个标点,指纹就全变——用来验完整性,但哈希本身不保密。
生活类比
哈希像”菜品的唯一编号”:同样食材做出同一道菜,编号一致;动了一味料,编号就完全不同。你拿到编号无法反推菜谱(不可逆),但能比对”上桌的菜和点的菜编号一不一致”来判断有没有被掉包。
核心概念(大白话 + 原书定义)
1. 哈希的用途
- 完整性校验:发送方算 digest 随消息发,接收方重算并比对;不一致即被篡改(哪怕只差一个空格,digest 也天差地别)。
- 数字签名基础:对 digest 而非全文签名,效率更高(见下篇)。
2. 密码学哈希五大要求(RSA Security)
- 输入可为任意长度;
- 输出长度固定;
- 计算容易;
- 单向(one-way):由输出极难反推输入;
- 抗碰撞(collision resistant):极难找到两个不同消息产生相同哈希。
3. 主流哈希算法与长度(必背表)
| 算法 | 输出长度 | 状态 | |—|—|—| | MD5 | 128 位 | ❌ 已不安全(有碰撞,2005 证明可造同 MD5 的不同证书) | | SHA-1 | 160 位 | ❌ 已弃用(NIST 不推荐,2017 浏览器弃用) | | SHA-2:SHA-224/256/384/512 | 224/256/384/512 位 | ✅ 当前主流安全 | | SHA-3(Keccak) | 同 SHA-2 各档 | ✅ 安全,但较慢,少用于通用 | | RIPEMD-160 | 160 位 | ✅ 仍安全(比特币用);RIPEMD-128/256 不安全 | | HAVAL | 128/160/192/224/256 | 变长变体 | | HMAC | 可变 | 见下篇(带密钥的哈希) |
注:SHA-2 家族中 SHA-256(512 位块)、SHA-512(1024 位块)最常用。SHA-3 与 SHA-2 安全同级但算法不同、速度更慢。
4. 关键陷阱
- 哈希不提供保密性:digest 公开也不泄露原文,但明文若随消息发,明文本身 unprotected。
- 碰撞即淘汰:MD5、SHA-1 都因被发现碰撞而弃用——算法”过时”往往源于数学攻击而非实现错误。
- RIPEMD 反直觉:RIPEMD-160 安全,但 RIPEMD-256 不安全(后者基于不安全的 128 变体、只是加长)。
真实案例
- MD5 证书碰撞(2005):研究者用不同公钥造出相同 MD5 哈希的两张数字证书——直接宣告 MD5 退出签名舞台。
- SHA-1 退场:被发现弱点后,主流浏览器 2017 起不再信任 SHA-1 证书。
考试怎么考
- 题型 A:问”哪种哈希已因碰撞被弃用” → MD5 / SHA-1。
- 题型 B:SHA-256 输出长度 → 256 位;问哈希是否可逆 → 否(单向);问哈希能否保证保密 → 不能,只保完整。
- 必记混淆项:① 哈希≠加密,不可逆、不保密;② SHA-2 安全、SHA-1/MD5 不安全;③ RIPEMD-160 安全但 -256 不安全;④ 碰撞是哈希的死穴。
记忆口诀
“哈希五要件:任意入、定长出、易算、单向、抗碰撞;MD5/SHA1 已废、SHA2/SHA3 稳;哈希只验完整不保密。”
自测
- 为什么 MD5 不再适合用于保证消息完整性?(答:已被证明存在碰撞攻击,可构造出哈希相同的不同消息)
- 哈希函数本身能否提供数据的保密性?(答:不能,哈希是单向且公开算法,只用于验证完整性而非保密)