← [ BACK_TO_NOTES ]

密码学哈希函数(Cryptographic Hash Function)

密码学哈希函数把任意长度输入映射为固定长度摘要,并追求 preimage、second-preimage 与 collision resistance;哈希不提供 confidentiality 或 keyed authentication,也不应直接替代 password KDF、HMAC 或数字签名。

#evergreen #concept #crypto

[!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,但设计目标不同。

学习检查

  1. 为什么固定长度 hash 不可能保证绝对唯一?
  2. preimage、second-preimage、collision resistance 有什么差异?
  3. 为什么 n-bit digest 的 collision security 不是简单 n bit?
  4. 普通 hash 为什么不能提供 message authentication?
  5. 文件 SHA-256 校验为什么要求 reference digest 本身可信?
  6. 为什么 SHA256(password) 不适合密码存储?
  7. “MD5/SHA-1 被破解”更准确地应该描述哪个安全性质?
  8. HMAC、password KDF、digital signature 分别怎样使用 hash,但又解决不同问题?
创建于 2026/1/6 更新于 2026/9/30
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本