基于哈希的签名:从一次性签名到无状态后量子密码体系

密码学概念 · 2026-06-20

概述

基于哈希的数字签名(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 位消息为例:

为什么只能使用一次?

签名 $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))$。

CODE
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$,校验和必然减小,而减小哈希链值需要求哈希逆——在计算上不可行。

CODE
完整 W-OTS 签名结构:
  σ = (σ₁, σ₂, ..., σₗ₁,  // 消息部分的签名
       c₁, c₂, ..., cₗ₂)   // 校验和的签名

其中 l₁ = ⌈n / log₂(w)⌉,l₂ = ⌈log₂(l₁(w-1)) / log₂(w)⌉ + 1

W-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字节),表中为展开后尺寸

CODE
## Merkle 签名方案:突破"一次一钥"的限制

### 核心思想

Merkle(1979)的洞察是:**用 Merkle 树将大量 OTS 公钥"绑定"到单一根哈希值**。根哈希就是全局公钥,每次签名使用树中不同的 OTS 密钥对,并通过认证路径(authentication path)证明所用 OTS 公钥属于这棵树。
Merkle 签名方案 (MSS) 结构:

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' 是否等于全局公钥

XMSS^MT 超树结构(简化):

Level d (顶层 XMSS 树) | Level d-1 (中间 XMSS 树) | Level d-2 (中间 XMSS 树) | ... | Level 1 (底层 XMSS 树) | WOTS+ 密钥对 → 实际签名消息

CODE
每棵子树的根由更高层的子树签名。顶层树只需一棵,但其每个叶节点的公钥由下一层树的根签名。这种分层结构使得密钥可以按需生成——不需要一次性计算所有 $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 对比**:
┌──────────────────┬──────────────────────┬──────────────────────┐ │ 特性 │ XMSS │ LMS │ ├──────────────────┼──────────────────────┼──────────────────────┤ │ 底层 OTS │ W-OTS+ │ LM-OTS │ │ 标准化 │ RFC 8391 (2018) │ RFC 8554 (2019) │ │ 多树变体 │ XMSS^MT │ HSS │ │ 签名尺寸 │ ~2.5-15 KB │ ~5-28 KB │ │ 公钥尺寸 │ 64 字节 (2×32) │ 64 字节 (2×32) │ │ 私钥(种子) │ 48 字节 │ 48 字节 │ │ 前向安全 │ 是 │ 是 │ │ 量子安全假设 │ 哈希抗碰撞性 │ 哈希抗碰撞性 │ │ 典型应用场景 │ 区块链、固件签名 │ 固件/软件签名 │ └──────────────────┴──────────────────────┴──────────────────────┘ SPHINCS+ 超树结构(简化,3层):

┌─────────────┐ │ 超树根公钥 │ ← 全局公钥(32字节) └──────┬──────┘ │ ┌────────────┼────────────┐ │ │ │ XMSS树根₀ XMSS树根₁ XMSS树根₂ ← 顶层 XMSS │ │ │ ┌────┴────┐ ┌────┴────┐ ┌────┴────┐ │ │ │ │ │ │ WOTS+ WOTS+ WOTS+ WOTS+ WOTS+ WOTS+ ← 中层 XMSS │ │ │ │ │ │ FORS FORS FORS FORS FORS FORS ← 底层 FORS

CODE
### FORS:少次签名方案

SPHINCS+ 的底层组件是 FORS(Forest Of Random Subsets),一种**少次签名方案**(Few-Time Signature, FTS)——与 OTS 不同,FTS 允许同一密钥对安全地签署多条消息,安全性随签名次数逐渐降低(而非突然崩溃)。
FORS 结构 (k=3, t=2²=4):

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₂) - 附带每棵树的认证路径

CODE
**为什么 FORS 是"少次"而非"一次"**:每次签名只揭示每棵树的一个叶节点(而非全部)。攻击者需要碰巧遇到相同的消息摘要块组合才能伪造,这在统计上极不可能(前提是签名次数远小于 $t$)。

### 无状态的实现原理

SPHINCS+ 的无状态性来自一个巧妙设计:**用消息哈希的随机性来选择使用哪个 FORS 密钥**。
签名流程: 1. 计算消息哈希: h = H(msg) 2. 用 h 的前 k×a 位作为 FORS 的索引 3. 用选中的 FORS 密钥签名消息哈希的剩余部分 4. 用 XMSS 签名 FORS 公钥 5. 组合完整签名

因为索引由消息决定(伪随机),所以: - 相同消息 → 相同索引 → 相同签名(确定性) - 不同消息 → 不同索引 → 不同 FORS 密钥 - 无需记录"用过哪些密钥"

CODE
### 性能与尺寸
┌──────────────────────┬──────────┬──────────┬──────────┐ │ 方案 │ 签名(B) │ 公钥(B) │ 签名/秒 │ ├──────────────────────┼──────────┼──────────┼──────────┤ │ LMS (HSS h=20) │ 5120 │ 64 │ ~2500 │ │ XMSS (h=20) │ 2692 │ 64 │ ~1400 │ │ SLH-DSA-128f │ 17088 │ 32 │ ~55 │ │ SLH-DSA-256f │ 49856 │ 64 │ ~15 │ │ Dilithium2 (格密码) │ 2420 │ 1312 │ ~20000 │ │ ECDSA P-256 │ 64 │ 32 │ ~50000 │ └──────────────────────┴──────────┴──────────┴──────────┘

注:SLH-DSA 即 FIPS 205 标准化的 SPHINCS+。 性能数据为近似值,取决于具体实现和硬件。参考实现:OpenSSL 3.2+(含SPHINCS+ provider)、SPHINCS+ 参考实现(GitHub: sphincs/sphincsplus)。测试数据基于单线程、Intel x86_64 架构。

CODE
SPHINCS+ 的签名比 Dilithium 大约 7-20 倍,签名速度慢 300-1000 倍。这是无状态的代价。

## 安全性分析

### 安全假设的最小性

HBS 方案的安全性仅依赖哈希函数的以下性质:
┌─────────────────────────────────────────────────────────────┐ │ HBS 的安全性依赖层次 │ │ │ │ 第一层:抗原像性(Preimage Resistance) │ │ H(x) = y,已知 y 求 x 不可行 │ │ → 防止从公钥反推私钥 │ │ │ │ 第二层:第二原像性(Second Preimage Resistance) │ │ 给定 x,求 x' ≠ x 使得 H(x) = H(x') 不可行 │ │ → 防止对已签名消息的伪造 │ │ │ │ 第三层:抗碰撞性(Collision Resistance) │ │ 求 x ≠ x' 使得 H(x) = H(x') 不可行 │ │ → 防止 Merkle 树中的内部碰撞攻击 │ │ │ │ 对比其他签名方案: │ │ RSA → 大整数分解困难性 │ │ ECDSA/SM2 → 椭圆曲线离散对数困难性 │ │ Dilithium → 格上困难问题 (MLWE/MSIS) │ │ │ │ HBS 的假设是密码学中最基础、研究最充分的 │ └─────────────────────────────────────────────────────────────┘ ┌──────────────────────┬──────────────────┬──────────────────┐ │ 指标 │ SLH-DSA-SHA256 │ SLH-DSA-SM3 │ ├──────────────────────┼──────────────────┼──────────────────┤ │ 密钥生成 TPS │ ~1800 │ ~1800 │ │ 签名生成 TPS │ ~55 │ ~55 │ │ 签名验证 TPS │ ~5500 │ ~5000 │ │ 签名尺寸 │ 17088 B │ 17088 B │ │ 公钥尺寸 │ 32 B │ 32 B │ │ 经典安全强度 │ ~128 bit │ ~128 bit │ │ 量子安全强度 │ ~128 bit │ ~128 bit │ └──────────────────────┴──────────────────┴──────────────────┘

注:测试环境为 Intel Xeon Gold 5218,16核 2.3GHz。 SM3 实例化在验证环节略慢(~9%),与 SM3 和 SHA-256 的原始性能差异一致。

CODE
实验结论表明 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 方案的适用场景
┌─────────────────────────────────────────────────────────────────┐ │ HBS 方案选型决策树 │ │ │ │ 需要抗量子签名? │ │ │ │ │ ├─ 是 → 能接受有状态管理? │ │ │ │ │ │ │ ├─ 是 → 签名频率高、对尺寸敏感? │ │ │ │ ├─ 是 → XMSS / LMS │ │ │ │ │ (签名 2.5-14 KB, 高性能) │ │ │ │ └─ 否 → XMSS^MT / HSS │ │ │ │ (支持更多签名次数) │ │ │ │ │ │ │ └─ 否 → 需要与传统 API 兼容? │ │ │ ├─ 是 → SLH-DSA (SPHINCS+) │ │ │ │ (签名 17-50 KB, 无状态) │ │ │ └─ 否 → 考虑 Dilithium (格密码) │ │ │ (签名 ~2.4 KB, 更短更快) │ │ │ │ │ └─ 否 → 使用 ECDSA/SM2/Ed25519 即可 │ └─────────────────────────────────────────────────────────────────┘
CODE
**推荐场景**:

1. **固件/软件更新签名**:签名频率低、验证频率高、需要长期安全性。XMSS/LMS 是理想选择(NSA CNSA 2.0 指定)。

2. **区块链验证者签名**:需要聚合签名特性。注意:HBS 不支持原生聚合,但 XMSS 在区块链中可利用区块高度作为状态管理手段。

3. **高安全等级根 CA**:需要最高安全保证、可接受大签名和慢签名速度。SLH-DSA 是保守选择。

4. **物联网设备**:资源受限但需要抗量子安全。XMSS 的紧凑公钥和较快验证适合此场景。

## 与其他后量子签名方案的对比
┌──────────────────┬──────────────┬──────────────┬──────────────┬──────────────┐ │ 特性 │ SLH-DSA │ Dilithium │ Falcon │ XMSS │ │ │ (哈希) │ (格密码) │ (格密码) │ (哈希) │ ├──────────────────┼──────────────┼──────────────┼──────────────┼──────────────┤ │ 安全假设 │ 哈希安全性 │ MLWE/MSIS │ NTRU/SIS │ 哈希安全性 │ │ 签名尺寸 │ 17-50 KB │ 2.4-4.6 KB │ 0.7-1.3 KB │ 2.5-15 KB │ │ 公钥尺寸 │ 32-64 B │ 1.3-2.6 KB │ 0.9-1.7 KB │ 64 B │ │ 有状态性 │ 无 │ 无 │ 无 │ 有 │ │ 签名速度 │ 慢 │ 快 │ 中 │ 中 │ │ 验证速度 │ 快 │ 快 │ 快 │ 快 │ │ 标准化 │ FIPS 205 │ FIPS 204 │ FIPS 206 │ RFC 8391 │ │ 安全保守程度 │ 最高 │ 高 │ 高 │ 最高 │ │ 抗侧信道天然能力 │ 强(对称操作)│ 需专门防护 │ 需专门防护 │ 强 │ └──────────────────┴──────────────┴──────────────┴──────────────┴──────────────┘
``

HBS 的核心优势不在性能,而在安全保守性:它不依赖任何结构化数学问题的困难性,只依赖哈希函数这种最基础、研究最充分的密码原语。

总结

基于哈希的签名方案代表了密码学中"最小假设"哲学的极致体现:仅凭哈希函数的安全性——这个所有密码系统都不可或缺的基石——就能构造出可证明安全的数字签名。

从 Lamport 的一次性思想到 SPHINCS+ 的无状态设计,HBS 的演进历程展示了密码学家如何在安全性与实用性之间不断寻找平衡:

  • Lamport OTS:最纯粹的安全性,但尺寸不可行
  • W-OTS+:用哈希链压缩尺寸,但仍是一次性的
  • Merkle MSS:用树结构突破使用次数限制,但引入了有状态性
  • XMSS/LMS:标准化、前向安全、高性能,但需要状态管理
  • SPHINCS+/SLH-DSA:完全无状态,代价是签名尺寸增大一个数量级
在后量子迁移的浪潮中,HBS 凭借其无可匹敌的安全保守性,正在从学术概念走向工程实践。NIST FIPS 205 的发布(2024 年 8 月)标志着 HBS 正式进入"一般用途"签名标准行列。而国密 SM3 的实例化探索,则体现了中国在密码算法自主创新方面的持续努力。

理解 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.

相关实践