NonceNumber Used Once)是在特定密钥或协议上下文中通常要求不重复使用的数值,用来让每次加密、签名或协议运行都具备新鲜性。

核心问题

很多密码算法如果在同一密钥下重复使用相同输入,会泄露明文关系、密钥材料或认证能力。Nonce 解决的是“如何让相同密钥下的多次操作彼此区分”的问题。

Nonce 不一定必须保密,但通常必须满足唯一性;某些协议还要求随机性或不可预测性。

核心机制

Nonce 的作用取决于算法:

  • 对称加密 的 CTR、GCM、ChaCha20 等模式中,它参与生成密钥流或认证输入。
  • 认证加密 中,它和密钥、关联数据、明文一起决定密文和认证标签。
  • 在握手协议中,它可以防止重放,并把本次会话和旧会话区分开。
  • ECDSA 等签名算法中,签名 nonce 质量会直接影响私钥安全。

设计上常见做法是“随机 nonce”或“计数器 nonce”。随机 nonce 依赖足够大的空间和可靠随机数;计数器 nonce 依赖状态持久化和并发安全。

工程用途

  • 网络消息加密:每条记录或数据包使用不同 nonce。
  • 文件分块加密:块编号、文件 ID 和版本号可参与 nonce 构造。
  • 协议握手:客户端和服务端随机数用于防重放和密钥派生。
  • 签名算法ECDSA 需要每次签名使用唯一且不可预测的临时值;RFC 6979 这类确定性方案会从私钥和消息摘要派生该值,避免依赖低质量随机源。

边界与常见坑

  • nonce 通常不是密钥:泄露 nonce 不一定危险,重复 nonce 才常是灾难。
  • 唯一性范围要看密钥:通常要求同一密钥下不重复,不同密钥下可以重新计数。
  • 随机不等于唯一:空间太小、随机数源故障或高并发都可能造成碰撞。
  • 计数器要持久化:进程重启、回滚快照、多实例并发都可能导致重复。
  • IV 和 nonce 不总是同义:不同算法对长度、随机性和唯一性的要求不同,不能随意替换。

相关术语