Archipelago

Lec 21密码学:哈希函数

讲义完成更新于 2026-09-17

Lec 21 密码学:哈希函数(Cryptography: Hash Functions)

TL;DR

  • 密码学哈希函数核心特征:将任意长度输入确定性映射为固定长度 dd 比特输出,具有无需密钥、完全公开但输出外观具有“计算不可区分的真随机性”。
  • 三大安全防护基准:严格定义原像抗性(单向性,破解需 O(2d)O(2^d))、第二原像抗性(抗弱碰撞,破解需 O(2d)O(2^d))与抗碰撞性(抗强碰撞,由生日悖论攻破仅需 O(2d/2)O(2^{d/2}))。
  • 随机预言机模型(ROM):作为理论证明的安全黑盒理想参考系,任何新查询均等概率均匀抽取随机响应并保持全局一致记忆。
  • 密码学承诺与扩展应用:密码脱敏存储与完整性校验的理论基石;利用加盐随机数 C(x)=h(r∥x)C(x) = h(r \parallel x) 实现具备“严格隐藏性”与“不可抵赖绑定性”的密码学承诺机制。

密码学哈希函数定义与工业全景

在数据结构(如第 8 讲通用哈希)中,哈希表的核心诉求是“键分布均匀以避免冲突链过长”。而在密码学中,哈希函数的使命是作为单向压缩与完整性指纹的核心构件。

定义

密码学哈希函数(Cryptographic Hash Function) 密码学哈希函数是一个确定性、公开且高效可计算的函数映射:

h:{0,1}∗→{0,1}dh : \{0, 1\}^* \to \{0, 1\}^d

它能够将任意长度的二进制消息串 m∈{0,1}∗m \in \{0, 1\}^* 压缩为固定位宽为 dd 的二进制串(称为消息摘要或哈希值)。该函数内部不包含任何秘密密钥,算法完全公开,任何人都可在多项式时间内独立计算。

哈希算法家族输出位宽 dd预期抗强碰撞安全性历史与当前安全状态
MD4128 bit2642^{64}严重破损(Wang 等人,测试 262^6 次即碰撞)
MD5128 bit2642^{64}严重破损(测试 2372^{37} 次碰撞,禁止用于安全系统)
SHA-1160 bit2802^{80}理论与实践破损(SHAttered 攻击,实测 2632^{63} 碰撞)
SHA-256256 bit21282^{128}目前国际主流工业标准,数学结构坚固
SHA-512512 bit22562^{256}高安全需求标准,抗量子攻击裕度充足

随机预言机模型(Random Oracle Model)

在评估加密协议安全性时,密码学家常引入一个理想化的数学抽象——随机预言机(Random Oracle):

  • 设想存在一个受信任的神谕黑盒 O\mathcal{O};
  • 对于任意从未见过的输入查询 x∈{0,1}∗x \in \{0, 1\}^*,O\mathcal{O} 从输出空间 {0,1}d\{0, 1\}^d 中完全均匀随机地抽取一个 dd 比特串作为响应返回;
  • 若输入查询 xx 此前曾经被询问过,O\mathcal{O} 则精准返回历史记录的相同结果;
  • 外部观察者无法预测任何未曾查询过的输入的输出值。

虽然真正的随机预言机因需要无限存储状态而在物理现实中无法实现,但在安全证明中,若一个协议在随机预言机模型下被证明是安全的,表明其没有算法结构逻辑漏洞,在工程中只需用高强度的伪随机哈希函数(如 SHA-256)作为预言机的实体替代。


核心安全属性与数学层次关系

一个合格的密码学哈希函数必须在计算复杂度层面上满足以下三层递进的防御属性:

1. 原像抗性(Preimage Resistance / 单向性 One-Way)

定义

原像抗性 给定随机目标摘要 y∈{0,1}dy \in \{0, 1\}^d,任何多项式时间敌手想要在计算上找到任意满足 h(x)=yh(x) = y 的有效原像输入 xx,其成功的概率均可忽略不计。

  • 暴力破解复杂度:针对 dd 比特的输出空间,穷举搜索的期望测试次数为 Θ(2d)\Theta(2^d)。

2. 第二原像抗性(Second Preimage Resistance / 弱抗碰撞性)

定义

第二原像抗性 给定一个已知的输入原像 xx,任何多项式时间敌手想要找到另一个互异的输入 x′≠xx' \neq x,使得两者具有相同摘要 h(x′)=h(x)h(x') = h(x),其成功的概率均可忽略不计。

  • 暴力破解复杂度:目标摘要已被 xx 钉死,敌手只能不断盲测新的 x′x',期望穷举次数同样为 Θ(2d)\Theta(2^d)。

3. 抗碰撞性(Collision Resistance / 强抗碰撞性)

定义

抗碰撞性 任何多项式时间敌手想要自由寻找任意两个不同的输入对 x≠x′x \neq x',使得它们产生相同的哈希值 h(x)=h(x′)h(x) = h(x'),其成功的概率均可忽略不计。

定理

生日悖论与碰撞攻击下界 寻找任意哈希碰撞的算法复杂度上限为 O(2d/2)O(2^{d/2}),而非 O(2d)O(2^d)。

证明: 根据概率论中的生日问题,当从大小为 N=2dN = 2^d 的空间中独立随机抽取 kk 个样本时,出现至少一对相同元素的概率为:

Pr⁡[存在碰撞]≈1−e−k22N\Pr[\text{存在碰撞}] \approx 1 - e^{-\frac{k^2}{2N}}

令碰撞概率达到 1/21/2,解得所需样本数量为:

k≈2ln⁡2⋅2d/2≈1.177×2d/2k \approx \sqrt{2 \ln 2} \cdot 2^{d/2} \approx 1.177 \times 2^{d/2}

因此,一个标称 d=128d = 128 比特的哈希函数(如 MD5),其实际抗强碰撞安全强度仅为 2642^{64} 运算量;这也是现代安全标准全面强制迁移至 d≥256d \ge 256 比特(安全强度 ≥2128\ge 2^{128})的数学根源。

属性之间的单向包含关系

  • 抗强碰撞性   ⟹  \implies 抗弱碰撞性:若一个函数连自由寻找任意碰撞都做不到,显然更不可能针对特定的固定 xx 定向命中碰撞。
  • 单向性 \centernot  ⟹  \centernot\implies 抗碰撞性:反例:构造函数 h′(x)=h(x[2..n])h'(x) = h(x[2..n])(丢弃最高位)。显然求原像依然极难(单向),但只需反转第一位(0∥s0 \parallel s 与 1∥s1 \parallel s)即可在 O(1)O(1) 时间内确定性制造碰撞!
  • 抗弱碰撞性 \centernot  ⟹  \centernot\implies 单向性:反例:构造函数 h′′(x)=0∥xh''(x) = 0 \parallel x(当 ∣x∣<d|x| < d 时直接透传)。显然无法找到第二原像,但对短字符串可以直接逆向还原明文,完全失去单向性。

经典密码学应用场景

1. 密码安全脱敏认证

现代系统绝不在数据库中明文保存用户登录密码:

  • 用户注册时,服务端仅持久化存储密码的加盐哈希 H=h(salt∥password)H = h(salt \parallel password);
  • 认证时,服务端重新将用户输入的明文与存储的 saltsalt 拼接计算哈希比对;
  • 由单向原像抗性保证:即使整个数据库被黑客拖库盗窃,攻击者也无法在多项式时间内逆向还原出明文密码。

2. 软件分发与文件防篡改完整性校验

  • 镜像站或软件发布者在安全的受信通道公示软件包的哈希指纹(如 sha256sum nginx.tar.gz);
  • 客户端下载大型软件包后在本地重新计算哈希值比对;
  • 由第二原像抗性保证:网络中间人(MitM)在篡改软件包并植入木马后,无法构造出一个与原合法包具有相同哈希值的恶意文件。

3. Merkle 树与区块链轻客户端状态校验

Ralph Merkle 在 1979 年提出基于哈希递归折叠的 Merkle 树:

  • 底层叶子节点保存交易或数据块的哈希;
  • 内部非叶节点为其左右子节点哈希的拼接散列:Parent=h(Left∥Right)Parent = h(Left \parallel Right);
  • 验证任意交易是否被包含在区块链账本中,仅需出示一条长度为 O(log⁡n)O(\log n) 的哈希证明路径(Merkle Proof),使得轻量级移动客户端无需同步全量账本即可完成密码学级别验证。

4. 零知识盲竞标与密码学承诺机制

在密封竞标或区块链去中心化彩票中,参与者 Alice 必须在开奖前提交出价 xx,但不能提前泄露数值,且开奖时绝不允许篡改出价。

密码学承诺方案(Commitment Scheme) 承诺方案由两个阶段组成:

  1. 承诺阶段(Commit):Alice 生成随机盐 r∈R{0,1}256r \in_R \{0, 1\}^{256},计算承诺值 c=h(r∥x)c = h(r \parallel x) 并公开 cc;
  2. 揭示阶段(Reveal):竞标结束后,Alice 公开明文对 (x,r)(x, r),验证者核验 h(r∥x)=?ch(r \parallel x) \stackrel{?}{=} c。 :::

该方案满足两大约束:

  • 隐藏性(Hiding):在揭示前,根据哈希函数的单向性与伪随机性,即便知晓 cc,任何第三方无法获取关于 xx 的任何信息;
  • 绑定性(Binding):根据抗强碰撞性,Alice 在公开 cc 之后,绝无可能找到另一对不同数值 (x′,r′)(x', r') 使得 h(r′∥x′)=ch(r' \parallel x') = c。

我的理解

密码学哈希函数是信息理论中“单向熵增陷阱”的物理具象:

  1. 压缩性与单向性的张力:从无穷大空间 {0,1}∗\{0, 1\}^* 映射到有限空间 {0,1}d\{0, 1\}^d,根据鸽巢原理,碰撞在数学上必然无穷无尽地存在。密码学的美妙之处在于:它不强求“绝对不存在碰撞”,而是通过计算复杂性设置了一道坚不可摧的“热力学障碍”,让寻找碰撞的算法期望时间远远超出人类文明与宇宙寿命的尺度。
  2. 伪随机性的本质是摧毁结构:无论是 AES 还是 SHA-256,其核心运算均大量使用非线性 S 盒、位移与异或混合(Avalanche Effect,雪崩效应)。输入仅改变 1 个比特,输出平均有一半的比特发生翻转。正是这种对一切代数线性结构的无情粉碎,使得外部攻击者无法建立任何渐近分析方程,逼迫对抗者退化至盲目穷举。
  3. 数字世界的锚点信物:在虚拟世界中,数据拷贝边际成本为零。密码学哈希结合随机盐构筑的承诺与签名机制,第一次在无物理实体介质的信息空间中,确立了“时间的单向流逝”与“不可抵赖的因果契约”,成为现代公钥基础设施与分布式去中心化共识的先验基石。 :::