签名与验签:非对称密码学在认证中的应用
数字签名的核心运算流程体现了非对称密码学的非对称性——签名用私钥(保密),验签用公钥(公开分发):
- 哈希压缩:对原文计算密码学哈希 H = Hash(message),将任意长度原文压缩为固定长度摘要。这一步有两个目的:性能(直接对长消息做公钥运算极慢)和安全性(抵抗选择性伪造攻击)。
- 签名生成:sig = Sign(privateKey, H)。签名者在安全环境(TEE/HSM/隔离容器)中使用私钥对哈希值执行数学变换,生成签名值。
- 签名验证:result = Verify(publicKey, H, sig) → true/false。验证者使用签名者的公钥(可来自数字证书、密钥服务器或链上数据)独立执行验签计算。
最关键的安全约束:私钥必须永不离开安全环境,签名 nonce(一次性随机数)必须绝对不可预测且绝不可重用。
ECDSA nonce 重用是数字签名历史上代价最高的一类实践失败。ECDSA 签名公式为 (r, s) = Sign(d, k, H):d 是私钥(固定),k 是每签名的独立随机 nonce,H 是哈希。若两个不同消息使用相同 nonce k,对已知消息的签名者可从:(s1 - s2) × k ≡ H1 - H2 (mod n) → 恢复 k → 从 k, r, s1, H1 恢复私钥 d。2010 年 fail0verflow 团队利用索尼 PS3 固件签名中的固定 nonce(k 被硬编码为常量 4),仅凭两个公开签名即完全恢复 ECDSA 私钥,彻底破解了 PS3 的安全启动链。2013 年 Android Java SecureRandom 的 ECDSA 实现因熵源初始化缺陷导致区块链应用中的 nonce 重用,多起比特币私钥泄露事件即源于此。Ed25519 的设计核心创新之一正是确定性 nonce 生成(使用 PRF 从私钥和消息哈希派生 nonce),从根本上弥合了随机数质量的依赖。