密码学哈希函数(Cryptographic Hash Function)
密码学哈希函数把任意长度输入映射为固定长度摘要,并追求 preimage、second-preimage 与 collision resistance;哈希不提供 confidentiality 或 keyed authentication,也不应直接替代 password KDF、HMAC 或数字签名。
[!info] related notes
密码学哈希函数(Cryptographic Hash Function)
一句话定义
密码学哈希函数把任意长度输入映射为固定长度 digest:
message
→ H(message)
→ fixed-length digest
它的核心用途是生成短摘要,使后续系统可以讨论:
- integrity;
- fingerprint;
- signature input;
- MAC/KDF construction。
但 hash 本身:
- 不加密;
- 不需要 secret key;
- 不提供 sender authentication。
固定输出长度不代表“唯一”
例如 SHA-256 输出只有 2^256 种可能值,而输入空间远大于这个数量。
根据 pigeonhole principle:
collision 必然存在。
密码学要求的不是“绝对不会碰撞”,而是:
在可行计算资源下难以找到有用 collision。
因此不要把 digest 称为数学意义上的唯一 ID。
三个核心安全性质
Preimage Resistance
已知:
h
难以找到任意 message,使:
H(message) = h
这是“从 digest 反推一个原像困难”。
Second-Preimage Resistance
给定一个已知 message m:
难以找到 m’ ≠ m,使:
H(m’) = H(m)
Collision Resistance
难以找到任意不同:
m1 ≠ m2
使:
H(m1) = H(m2)
collision resistance 与 second-preimage resistance 不是同一个性质。
Birthday Bound
n-bit hash 的 collision security 大约受 birthday bound 限制到 2^(n/2) 级。
因此:
- SHA-256 的 collision strength 约在 128-bit 级;
- preimage security 则是不同量级。
不要把 output length 直接当作所有攻击类型的 security strength。
Avalanche Effect
理想 hash 中,输入变化一小部分,输出应产生广泛、不可预测变化。
这是良好 diffusion 特征。
但:
avalanche effect 本身不等于完整 cryptographic security proof。
Hash 不提供 Message Authentication
如果只发送:
message + SHA256(message)
攻击者可以:
- 修改 message;
- 重新计算 SHA-256;
- 一起替换 digest。
所以 hash 能检测:
- accidental corruption;
- 和一个可信来源的已知 digest 比较时的修改;
但不能单独证明:
这条消息来自持有 secret 的合法发送者。
需要 HMAC 或数字签名。
文件完整性
如果软件官网通过 HTTPS 或签名渠道提供可信 SHA-256 digest:
downloaded file
→ SHA-256
→ compare known trusted digest
可以检测文件是否变化。
关键前提是:
reference digest 本身来自可信渠道。
如果攻击者能同时替换文件和网页上的 digest,普通 hash 无法阻止。
Password Storage
不要直接存:
SHA256(password)
原因:
- 普通 hash 设计得很快;
- attacker 可高并发爆破;
- 人类密码 entropy 很低。
Password storage 应使用:
- Argon2id;
- scrypt;
- PBKDF2 等 password-based KDF;
配合 salt 与合理 cost。
详见 KDF。
Digital Signature
签名 scheme 通常会对 message 做 hash / encoding,再执行 signature operation。
但:
hash 只是 signature scheme 的一个组件。
不能自己做:
SHA256(message) + raw private-key math
来替代标准数字签名算法。
HMAC
HMAC 使用:
secret key + hash construction
→ authentication tag
因此:
Hash
≠ HMAC
HMAC 引入共享 secret,从而提供 message authentication。
常见算法
MD5
- 128-bit output;
- collision resistance 已严重破坏;
- 不应再用于任何需要 adversarial collision resistance 的安全设计。
但作为非对抗场景的快速 legacy checksum 仍可能遇到。
SHA-1
- 160-bit output;
- 实用 collision attack 已被展示;
- 不应用于新的 digital signature / certificate collision-security 场景。
SHA-2
常见:
- SHA-256;
- SHA-384;
- SHA-512。
仍是现代主流 cryptographic hash family。
SHA-3
基于 Keccak,与 SHA-2 结构不同。
提供:
- SHA3-256;
- SHA3-512;
- SHAKE 等相关标准 primitive。
“被破解”要说清楚攻击性质
说:
MD5 / SHA-1 被破解
过于模糊。
更准确:
- 它们的 collision resistance 已不满足现代安全要求;
- 这不等于从任意 digest 都能立即逆推出原文;
- 不同攻击目标的安全性质不同。
Hash 与 Hash Table 不是同一安全语境
编程语言 HashMap 里的 hash function 主要追求:
- speed;
- distribution;
- table performance。
密码学 hash 追求 adversarial security。
虽然都叫 hash,但设计目标不同。
学习检查
- 为什么固定长度 hash 不可能保证绝对唯一?
- preimage、second-preimage、collision resistance 有什么差异?
- 为什么 n-bit digest 的 collision security 不是简单 n bit?
- 普通 hash 为什么不能提供 message authentication?
- 文件 SHA-256 校验为什么要求 reference digest 本身可信?
- 为什么 SHA256(password) 不适合密码存储?
- “MD5/SHA-1 被破解”更准确地应该描述哪个安全性质?
- HMAC、password KDF、digital signature 分别怎样使用 hash,但又解决不同问题?