首页/安全/加密与证书速查/ECDSA 随机数 k 的安全要求
加密算法基础95 条

ECDSA 随机数 k 的安全要求

ECDSA 签名依赖一次性随机数 k:k 重复或可预测即可从两个签名中恢复私钥;工程上推荐 RFC 6979 的确定性 k 或使用成熟库。

加密与证书速查安全更新于 2026-10-13

ECDSA 随机数 k 是什么

ECDSA 签名需要每个签名一个的一次性随机数 k,签名结果 (r, s) 中的 r 由 k 与基点运算得到。如果同一私钥下两次签名使用了相同的 k,攻击者用两条签名的 s 值就能解出私钥,这是纯数学推导,不需要任何额外假设。工程上的正确做法是使用 RFC 6979 的确定性 k 派生,或直接调用成熟库,不要自行生成随机数。

基本信息

核心规则同一私钥下 k 必须唯一且不可预测
确定性方案RFC 6979:由私钥与消息散列派生 k
历史案例2010 年 PS3 因 k 固定导致私钥被恢复
现代替代Ed25519 等方案从设计上消除随机数依赖

典型使用场景

  • 签名服务:多实例与容器复制后随机状态可能重复,需要评估熵源
  • 硬件签名设备:确认固件使用合规随机源
  • 代码审计:重点查看自行实现的 k 生成逻辑
  • 区块链与数字签名场景:k 复用会直接造成资产损失
  • 迁移评估:从 ECDSA 迁到 Ed25519 以消除随机数依赖

交给成熟库处理

交给成熟库处理
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import ec

private_key = ec.generate_private_key(ec.SECP256R1())
signature = private_key.sign(data, ec.ECDSA(hashes.SHA256()))   # 库内部安全处理 k
private_key.public_key().verify(signature, data, ec.ECDSA(hashes.SHA256()))

风险来源与对策

风险来源表现对策
随机源故障两次签名 k 相同使用 RFC 6979 或成熟库
快照回滚随机状态重复评估熵源质量,避免克隆后直接签名
自制生成逻辑取模偏置或可预测不要自行实现,交由库处理
侧信道时序与功耗泄漏使用常量时间实现或硬件模块
私钥恢复只需要两条签名:一旦 k 重复,攻击者不必暴力破解,直接联立方程即可得到私钥,因此 k 的质量直接等于私钥的安全。

落地检查项

  • 确认签名代码来自成熟库而不是自研实现
  • 检查设备或容器重启后的随机源状态
  • 对高价值密钥使用硬件模块或 HSM
  • 定期审计签名服务的实现版本与已知漏洞
RFC 6979 的确定性方案把 k 绑定到私钥与消息散列,同一消息重复签名得到相同结果,既避免了随机源故障,也便于测试复现。

易错点

  • 自行实现 k 的生成并做取模:偏置与可预测性会暴露私钥,应交给成熟库处理
  • 容器或虚拟机从同一快照启动:随机状态可能重复,导致两节点产出相同 k,签名服务要评估熵源
  • 只关注 k 的唯一性而忽略可预测性:可被推算的 k 同样能恢复私钥
  • 把随机数依赖当成实现细节:FIPS 186-5 与 RFC 6979 都有明确要求,审计时应作为必查项
  • 签名失败重试时沿用同一个 k:重试路径也要重新取随机数,否则与 k 复用等价

数据来源与参考

  • RFC 6979(确定性 DSA/ECDSA)
  • FIPS 186-5 附录(随机数与密钥生成)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌