基于哈希的签名:从一次性签名到无状态后量子密码体系
概述
基于哈希的数字签名(Hash-Based Signature, HBS)是现代密码学中安全性假设最弱的密码原语:它的安全性完全依赖于底层哈希函数的抗碰撞性和抗原像性——这些假设是所有数字签名方案都必需的,不多也不少。这意味着只要哈希函数是安全的,HBS 就是安全的。
这一特性在后量子时代具有特殊价值。Shor 算法可以在多项式时间内解决大整数分解和离散对数问题,从而摧毁 RSA、ECDSA、SM2 等主流签名方案的数学基础。而 Grover 算法对哈希函数的加速仅为平方根级别(将 $O(2^n)$ 降至 $O(2^{n/2})$),通过简单地将哈希输出长度翻倍即可维持相同安全强度。因此,HBS 被公认为理论安全性最强的后量子签名技术路线。
HBS 方案的演进经历了半个世纪:从 Lamport(1979)提出的一次性签名,到 Merkle(1979)用树结构突破使用次数限制,再到 Winternitz(1980s)用哈希链压缩尺寸,最终发展到 SPHINCS+(2015/2024)通过超树结构实现完全无状态。这条演进线索体现了密码学中一个核心命题:如何在最小假设上构造越来越实用的密码系统。
一次性签名:构建 HBS 的基石
Lamport OTS
1979 年,Leslie Lamport 提出了首个基于单向函数的数字签名方案。核心思想极其简洁:用哈希值作为"公钥片段",用哈希原像作为"私钥片段",签名时选择性地暴露私钥片段。
以一个 4 位消息为例:
密钥生成:
消息位位置: bit0 bit1 bit2 bit3
私钥 (随机): sk0,0 sk0,1 sk1,0 sk1,1 sk2,0 sk2,1 sk3,0 sk3,1
公钥 (哈希): pk0,0 pk0,1 pk1,0 pk1,1 pk2,0 pk2,1 pk3,0 pk3,1
其中 pk_i,j = H(sk_i,j)
签名消息 m = 1011:
签名 σ = (sk0,1, sk1,0, sk2,1, sk3,1)
// 对每个消息位,暴露对应值的私钥片段
验证:
检查 H(sk0,1) = pk0,1 ✓
检查 H(sk1,0) = pk1,0 ✓
检查 H(sk2,1) = pk2,1 ✓
检查 H(sk3,1) = pk3,1 ✓为什么只能使用一次?
签名 $m = 1011$ 暴露了 sk₀,₁、sk₁,₀、sk₂,₁、sk₃,₁。如果再用同一密钥签 $m' = 0110$,则暴露 sk₀,₀、sk₁,₁、sk₂,₁、sk₃,₀。攻击者现在知道了 bit2 的两个值(sk₂,₀ 和 sk₂,₁),可以伪造 bit2 任意的任何消息。
Lamport OTS 的尺寸问题:对于 $n$ 位消息和 $k$ 位哈希输出,私钥大小 = $2n \times k$ 位,公钥大小 = $2n \times k$ 位,签名大小 = $n \times k$ 位。以 SHA-256 签名 256 位消息为例:私钥 16 KB,公钥 16 KB,签名 8 KB。完全不实用。
Winternitz OTS:用哈希链换尺寸
Robert Winternitz 在 1980 年代提出了一个关键优化:不再逐位处理,而是用哈希链(Hash Chain)分组处理消息。
哈希链定义为:$H^0(x) = x$,$H^i(x) = H(H^{i-1}(x))$。
Winternitz 参数 w = 4 时,一条哈希链:
sk ──H──→ H(sk) ──H──→ H²(sk) ──H──→ H³(sk)
↓
pk = H³(sk) = H^w⁻¹(sk)
签名值 v = 2 时,暴露 H²(sk):
验证者计算 H(H(H²(sk))) = H³(sk) = pk ✓核心洞察:一条长度为 $w$ 的哈希链可以表示 $w+1$ 个不同值(0 到 $w-1$),相当于 $\log_2(w)$ 个 bit 位。$w$ 越大,签名越短,但计算量越大。
校验和的关键作用:
原始 W-OTS 存在一个微妙漏洞:如果签名值 $v = 2$,攻击者知道 $H^2(sk)$,可以计算 $H^3(sk)$ 和 $H^4(sk)$,从而伪造 $v = 3$ 或 $v = 4$ 的签名。
解决方案是附加一个校验和:$C = \sum_{i=1}^{l_1}(w - 1 - m_i)$,并对校验和也进行签名。如果攻击者增大某个 $m_i$,校验和必然减小,而减小哈希链值需要求哈希逆——在计算上不可行。
完整 W-OTS 签名结构:
σ = (σ₁, σ₂, ..., σₗ₁, // 消息部分的签名
c₁, c₂, ..., cₗ₂) // 校验和的签名
其中 l₁ = ⌈n / log₂(w)⌉,l₂ = ⌈log₂(l₁(w-1)) / log₂(w)⌉ + 1W-OTS+:现代安全增强
2013 年,Andreas Hülsing 提出 W-OTS+,通过随机化哈希链增强了安全性:
$$H^i(x, r) = F(H^{i-1}(x, r) \oplus r_i)$$
其中 $r = (r_1, r_2, \ldots, r_{w-1})$ 是公开随机掩码,每一步使用不同的"链函数"。这防止了利用哈希迭代结构中单点碰撞的攻击,使 W-OTS+ 成为 XMSS 和 SPHINCS+ 的底层 OTS 组件。
``┌─────────────────────────────────────────────────────────────┐
│ 一次性签名方案的尺寸对比 (n=256 bit, k=256 bit) │
├──────────────────┬──────────┬──────────┬──────────┬─────────┤
│ 方案 │ 私钥(B) │ 公钥(B) │ 签名(B) │ 签名次数 │
├──────────────────┼──────────┼──────────┼──────────┼─────────┤
│ Lamport OTS │ 16384 │ 16384 │ 8192 │ 1 │
│ W-OTS (w=16) │ 1152 │ 1152 │ 1152 │ 1 │
│ W-OTS+ (w=16) │ 576 │ 576 │ 576 │ 1 │
└──────────────────┴──────────┴──────────┴──────────┴─────────┘
注:W-OTS+ 私钥/公钥可压缩为单一种子(32字节),表中为展开后尺寸
## Merkle 签名方案:突破"一次一钥"的限制
### 核心思想
Merkle(1979)的洞察是:**用 Merkle 树将大量 OTS 公钥"绑定"到单一根哈希值**。根哈希就是全局公钥,每次签名使用树中不同的 OTS 密钥对,并通过认证路径(authentication path)证明所用 OTS 公钥属于这棵树。root = 全局公钥 / \ H(pk₀∥pk₁) H(pk₂∥pk₃) / \ / \ pk₀ pk₁ pk₂ pk₃ | | | | OTS₀ OTS₁ OTS₂ OTS₃ ↓ ↓ ↓ ↓ 签名m₀ 签名m₁ 签名m₂ 签名m₃
签名 m₂ 的结构: σ = (OTS₂ 签名, pk₃, H(pk₀∥pk₁)) ───────── ──── ───────────── OTS 签名 兄弟节点 认证路径节点
验证路径: 1. 用 OTS₂ 签名重建 pk₂' 2. 计算 H(pk₂' ∥ pk₃) = 中间节点 3. 计算 H(中间节点 ∥ H(pk₀∥pk₁)) = root' 4. 比较 root' 是否等于全局公钥
**Merkle 树的优雅之处**:
- 公钥仅为一个哈希值(通常 32 字节)
- 签名大小随树高 $h$ 对数增长($\approx 2h$ 个哈希值)
- 可签名 $2^h$ 条消息
- 安全性归约到哈希函数的抗碰撞性
### 有状态性:MTS 方案的根本限制
Merkle 签名方案(MSS)及其所有变体(XMSS、LMS 等)都是**有状态的**(stateful):签名者必须记住已经使用过哪些 OTS 密钥对,**绝对不能重复使用**。
这个限制带来三个实际问题:
1. **状态同步困难**:在分布式系统中,多个签名实例必须共享状态,否则可能重复使用密钥
2. **备份与恢复**:备份私钥后如果状态计数器丢失,无法安全地恢复签名
3. **虚拟机克隆**:云计算环境中虚拟机被克隆会导致两个实例使用相同状态
NIST SP 800-208(2020)明确指出,有状态 HBS 方案"不推荐用于一般用途",建议仅用于固件/软件签名等受控环境。
## 标准化方案:XMSS 与 LMS
### XMSS(eXtended Merkle Signature Scheme)
XMSS 由 Buchmann、Dahmen 和 Hülsing 于 2011 年提出,2018 年通过 IETF 标准化为 RFC 8391。
**关键设计选择**:
- 使用 W-OTS+ 作为底层 OTS(而非原始 W-OTS)
- 引入伪随机函数(PRF)从单一种子派生所有密钥,极大压缩私钥尺寸
- 支持多树变体 XMSS^MT(Multi-Tree),通过超树结构支持无限次签名Level d (顶层 XMSS 树) | Level d-1 (中间 XMSS 树) | Level d-2 (中间 XMSS 树) | ... | Level 1 (底层 XMSS 树) | WOTS+ 密钥对 → 实际签名消息
每棵子树的根由更高层的子树签名。顶层树只需一棵,但其每个叶节点的公钥由下一层树的根签名。这种分层结构使得密钥可以按需生成——不需要一次性计算所有 $2^{dh}$ 个 OTS 密钥。
**前向安全性**:XMSS 通过 PRF 实现前向安全——即使当前状态泄露,之前的所有签名仍然安全。这是因为 PRF 的输出在计算上不可逆。
### LMS(Leighton-Micali Hash-Based Signatures)
LMS 由 Leighton 和 Micali 于 1995 年提出,2019 年标准化为 RFC 8554。使用 LM-OTS 作为底层组件,采用类似的分层结构(HSS,Hierarchical Signature System)。
**XMSS vs LMS 对比**:### NSA CNSA 2.0 部署
2022 年,美国国家安全局发布 CNSA 2.0,明确要求:
- **立即开始**向 LMS 和 XMSS 过渡
- **2025 年前**优先使用
- **2030 年前**完全使用
这是 HBS 算法首次被纳入国家级密码部署要求,标志着从"学术研究"到"实战部署"的质变。适用场景包括:软件/固件更新签名、操作系统安全启动、根 CA 密钥保护。
## SPHINCS+:无状态的突破
### 设计动机
SPHINCS+(2015 年由 Bernstein 等提出,2022 年被 NIST 选为标准,2024 年发布 FIPS 205)解决了有状态 HBS 的根本问题:**完全消除密钥状态管理**。
核心思路:**用消息本身作为随机种子来选择使用哪个密钥**,而不是按顺序使用密钥。
### 超树结构
SPHINCS+ 使用超树(HyperTree)——一棵"树的树的树":┌─────────────┐ │ 超树根公钥 │ ← 全局公钥(32字节) └──────┬──────┘ │ ┌────────────┼────────────┐ │ │ │ XMSS树根₀ XMSS树根₁ XMSS树根₂ ← 顶层 XMSS │ │ │ ┌────┴────┐ ┌────┴────┐ ┌────┴────┐ │ │ │ │ │ │ WOTS+ WOTS+ WOTS+ WOTS+ WOTS+ WOTS+ ← 中层 XMSS │ │ │ │ │ │ FORS FORS FORS FORS FORS FORS ← 底层 FORS
### FORS:少次签名方案
SPHINCS+ 的底层组件是 FORS(Forest Of Random Subsets),一种**少次签名方案**(Few-Time Signature, FTS)——与 OTS 不同,FTS 允许同一密钥对安全地签署多条消息,安全性随签名次数逐渐降低(而非突然崩溃)。3 棵 Merkle 树,每棵有 4 个叶节点:
树₀: 树₁: 树₂: r₀ r₁ r₂ / \ / \ / \ a b c d e f / \ / \ / \ / \ / \ / \ sk sk sk sk sk sk sk sk sk sk sk sk
签名消息 m = (11, 01, 10): - 从树₀揭示 sk₀,₃(对应值 3 = 11₂) - 从树₁揭示 sk₁,₁(对应值 1 = 01₂) - 从树₂揭示 sk₂,₂(对应值 2 = 10₂) - 附带每棵树的认证路径
**为什么 FORS 是"少次"而非"一次"**:每次签名只揭示每棵树的一个叶节点(而非全部)。攻击者需要碰巧遇到相同的消息摘要块组合才能伪造,这在统计上极不可能(前提是签名次数远小于 $t$)。
### 无状态的实现原理
SPHINCS+ 的无状态性来自一个巧妙设计:**用消息哈希的随机性来选择使用哪个 FORS 密钥**。因为索引由消息决定(伪随机),所以: - 相同消息 → 相同索引 → 相同签名(确定性) - 不同消息 → 不同索引 → 不同 FORS 密钥 - 无需记录"用过哪些密钥"
### 性能与尺寸注:SLH-DSA 即 FIPS 205 标准化的 SPHINCS+。 性能数据为近似值,取决于具体实现和硬件。参考实现:OpenSSL 3.2+(含SPHINCS+ provider)、SPHINCS+ 参考实现(GitHub: sphincs/sphincsplus)。测试数据基于单线程、Intel x86_64 架构。
SPHINCS+ 的签名比 Dilithium 大约 7-20 倍,签名速度慢 300-1000 倍。这是无状态的代价。
## 安全性分析
### 安全假设的最小性
HBS 方案的安全性仅依赖哈希函数的以下性质:### 量子安全分析
| 攻击方式 | 对哈希函数的影响 | 对 HBS 的影响 |
|---------|----------------|-------------|
| Grover 算法 | 抗原像性从 $2^n$ 降至 $2^{n/2}$ | 将哈希输出从 256 位提升到 512 位即可维持 128 bit 安全 |
| BHT 算法 | 碰撞查找从 $2^{n/2}$ 降至 $2^{n/3}$ | 影响有限,可通过参数调整应对 |
| Shor 算法 | **不适用于哈希函数** | 无影响 |
**关键结论**:HBS 的量子安全不依赖任何数学困难问题的量子抗性,仅依赖哈希函数的对称安全性。通过将哈希输出长度翻倍,即可完全抵消量子加速。
### 已知攻击与参数选择
对 HBS 的主要攻击不是针对方案本身,而是针对底层哈希函数:
1. **多碰撞攻击**(Joux, 2004):对 Merkle-Damgård 结构的哈希,可以找到 $2^{k/2}$ 个碰撞,复杂度低于生日攻击。影响:需要选择足够大的哈希输出。
2. **Herding 攻击**(Reyzin & Reyzin, 2002):针对 Merkle 树的结构化攻击。影响:SPHINCS+ 通过随机化消息哈希来防御。
3. **量子碰撞查找**:Kuperberg 算法将碰撞查找的量子复杂度从 $O(2^{n/3})$ 优化。影响:需要更大的参数。
## 国密 SM3 实例化
### 背景与动机
HBS 方案的一个独特优势是**哈希无关性**(hash-agnostic):方案框架与具体哈希算法解耦,任何满足安全要求的哈希函数都可以实例化同一方案。
中国在后量子密码迁移中坚持自主创新原则,探索使用国密 SM3 算法(GM/T 0004-2012)实例化国际标准化的 HBS 方案。
### SM3 实例化的技术可行性
SM3 是中国自主设计的密码杂凑算法,输出长度 256 位,采用 Merkle-Damgård 结构,与 SHA-256 具有相似的安全性质。
**SM3 实例化方案**:
| 国际方案 | SM3 实例化名称 | 状态 |
|---------|--------------|------|
| XMSS (RFC 8391) | XMSS-SM3 | 国内标准草案阶段 |
| LMS (RFC 8554) | LMS-SM3 | 国内标准草案阶段 |
| SLH-DSA (FIPS 205) | SLH-DSA-SM3 | 研究验证阶段 |
### 性能对比
根据公开研究(张小青等, 2024),SLH-DSA-SM3 与 SLH-DSA-SHA256 的性能对比:注:测试环境为 Intel Xeon Gold 5218,16核 2.3GHz。 SM3 实例化在验证环节略慢(~9%),与 SM3 和 SHA-256 的原始性能差异一致。
实验结论表明 SM3 实例化在性能和安全性上与 SHA256 实例化完全等效,验证了国产哈希算法实例化国际 HBS 标准的可行性。
**Merkle-Damgård 结构对 HBS 安全性的影响**:SM3 与 SHA-256 均采用 Merkle-Damgård 结构,这意味着它们都受到 Joux(2004)多碰撞攻击的影响——对 $n$ 位输出的哈希函数,可以在 $O(2^{(n/3)})$ 复杂度内找到多碰撞。对于 SM3/SHA-256($n=256$),这一复杂度约为 $O(2^{85})$,远超实际攻击能力。但在 HBS 方案中,Merkle 树的层数 $h$ 和 FORS 的树参数 $k$ 需要根据这一理论上限来设计。当前 XMSS 和 SPHINCS+ 的参数选择($h \leq 60$,$k \leq 32$)远低于多碰撞攻击的实用边界,因此 SM3 实例化在安全性上与 SHA-256 等效。
### 标准化进展
- **国内**:基于 SM3 的有状态 HBS 方案(LMS-SM3、HSS-SM3)已形成初步标准草案
- **国际**:IETF 和 NIST 尚未将 SM3 列为官方推荐的 HBS 哈希算法
- **趋势**:随着国密算法国际化推进,SM3 实例化的标准化进程正在加速
## HBS 方案的适用场景**推荐场景**:
1. **固件/软件更新签名**:签名频率低、验证频率高、需要长期安全性。XMSS/LMS 是理想选择(NSA CNSA 2.0 指定)。
2. **区块链验证者签名**:需要聚合签名特性。注意:HBS 不支持原生聚合,但 XMSS 在区块链中可利用区块高度作为状态管理手段。
3. **高安全等级根 CA**:需要最高安全保证、可接受大签名和慢签名速度。SLH-DSA 是保守选择。
4. **物联网设备**:资源受限但需要抗量子安全。XMSS 的紧凑公钥和较快验证适合此场景。
## 与其他后量子签名方案的对比HBS 的核心优势不在性能,而在安全保守性:它不依赖任何结构化数学问题的困难性,只依赖哈希函数这种最基础、研究最充分的密码原语。
总结
基于哈希的签名方案代表了密码学中"最小假设"哲学的极致体现:仅凭哈希函数的安全性——这个所有密码系统都不可或缺的基石——就能构造出可证明安全的数字签名。
从 Lamport 的一次性思想到 SPHINCS+ 的无状态设计,HBS 的演进历程展示了密码学家如何在安全性与实用性之间不断寻找平衡:
- Lamport OTS:最纯粹的安全性,但尺寸不可行
- W-OTS+:用哈希链压缩尺寸,但仍是一次性的
- Merkle MSS:用树结构突破使用次数限制,但引入了有状态性
- XMSS/LMS:标准化、前向安全、高性能,但需要状态管理
- SPHINCS+/SLH-DSA:完全无状态,代价是签名尺寸增大一个数量级
理解 HBS 不仅是为了掌握一种签名方案,更是理解密码学中安全假设、效率权衡和工程折中的核心方法论。
参考来源
- Lamport, L. (1979). Constructing Digital Signatures from a One Way Function. *SLAC-R-981*.
- Merkle, R. C. (1989). A Certified Digital Signature. *CRYPTO '89*, LNCS 435, 218–238.
- Hülsing, A. (2013). W-OTS+ – Shorter Signatures for Hash-Based Signature Schemes. *AFRICACRYPT 2013*, LNCS 7918, 173–188.
- Bernstein, D. J., et al. (2015). SPHINCS: Practical Stateless Hash-Based Signatures. *EUROCRYPT 2015*, LNCS 9056, 368–397.
- Hülsing, A., et al. (2018). RFC 8391 – XMSS: eXtended Merkle Signature Scheme. *IETF*.
- McGrew, D., et al. (2019). RFC 8554 – Leighton-Micali Hash-Based Signatures. *IETF*.
- NIST. (2020). SP 800-208: Recommendation for Stateful Hash-Based Signature Schemes.
- NIST. (2024). FIPS 205: Stateless Hash-Based Digital Signature Standard (SLH-DSA).
- NSA. (2022). Commercial National Security Algorithm Suite 2.0 (CNSA 2.0).
- 国家密码管理局. GM/T 0004-2012 密码杂凑算法 SM3.
- 张小青, 等. (2024). 面向后量子密码算法的哈希签名方案. *通信技术*, 57(1), 54–62.
- Buchmann, J., Dahmen, E., & Hülsing, A. (2011). XMSS – A Practical Forward Secure Signature Scheme Based on Minimal Security Assumptions. *Post-Quantum Cryptography*, LNCS 7071, 117–129.
相关实践
- 如需了解后量子密码学的整体技术图景,请参阅《后量子密码学:从量子威胁到 NIST 标准化的新密码体系》
- 如需了解 SM3 国密哈希算法的详细实现,请参阅《SM3 密码杂凑算法原理详解》
- 如需了解 NIST 后量子密码标准化进程,请参阅《后量子密码学概述》