跳到主要内容
加密解密2026-10-04Begin3 分钟阅读

Ed25519 为什么赢了:确定性签名与 ECDSA 的 k 泄漏事故史

ECDSA 的原罪:每个签名都要掷一次骰子

ECDSA 签名时需要一个每次都新鲜、绝对保密、完全随机的临时数 k。听起来无害,但这个要求在过去十五年制造了三场著名事故:

  • 索尼 PS3(2010):固件签名代码用了固定 k——任何人都可从两个签名直接解出索尼的私钥,游戏机被「官方签名」解锁
  • 安卓比特币钱包(2013):某版本系统的随机数生成器有缺陷,弱 k 让一批钱包私钥可被复算,直接被盗刷
  • RFC 6979(2013):业界干脆发明了「确定性 k」——用私钥和消息哈希派生 k,不再依赖随机源。这是给旧算法打的补丁

问题的本质:ECDSA 把「高质量随机数」做成了每次签名的隐含安全前提,而随机数恰恰是工程史上最容易出错的输入。一次 k 复用、一次低熵,全部历史签名和私钥一起完蛋。

Ed25519 的答案:让随机数彻底出局

Daniel J. Bernstein 在 2011 年设计的 Ed25519(EdDSA 签名体系 + Curve25519 曲线)把补丁变成了设计:

  • 签名是确定性的——同一私钥对同一消息永远产生同一签名,不碰随机数生成器,k 泄漏这一整类事故结构性消失
  • 曲线是固定的——没有可传参的曲线方程,ECDSA 系的 invalid-curve / 无效点攻击面直接不存在
  • 实现难写错——完整的数学公式、明确的余因子处理,侧信道防护的实现门槛低于 ECDSA
  • 快且小——公钥 32 字节、签名 64 字节,验证速度显著快于 ECDSA P-256(同 128 位安全强度)

要强调的事实:Ed25519 与 ECDSA P-256 的数学安全强度相同。它赢的不是「更难破」,是工程性质——把最容易出错的部分从协议里删掉了。

谁已经押注了它

  • SSH:ssh-keygen -t ed25519 是各大发行版与 GitHub 的首选推荐,RSA 密钥已被视为过渡资产
  • TLS 1.3:密钥交换侧的 X25519(同族曲线)是默认组的一半——ML-KEM 混合握手的另一半就是它
  • Signal 协议:基于 X25519 构建其双重棘轮
  • JWT/JOSE:EdDSA 已是注册算法(对比 RS256 的密钥分发优势,见 JWT 与 Session 的取舍)
  • Git 签名 / minisign / age:新一代文件签名与加密工具几乎清一色 Ed25519

量子注脚

「现代经典算法」不等于「永远安全」——Ed25519 的椭圆曲线地基与 RSA 一样在 Shor 算法的打击名单上(见谁的数据需要先迁 PQC)。有趣的是它的两个身份:当下它是「经典世界里最好的签名」,迁移期它是 hybrid 密钥交换的经典半边,终局它会被 ML-DSA 复合方案逐步接替。选它不是押错方向,而是每一代都选工程性质最好的那一个。

实现注记 / Implementer's note

站内 JWT 生成器目前只实现了 HS256——这是个诚实的取舍:HMAC 在浏览器 WebCrypto 里所有版本行为一致,而 Ed25519 直到近两年才在主流浏览器陆续落地(且各家的原始密钥导出行为曾有差异)。这正印证了本文主题:算法的工程性质(实现一致性、误用面)决定它进入产品的速度,纯数学强度反而是最容易满足的项。给工具矩阵加 EdDSA 签名的时机,就看浏览器碎片化收敛到什么程度——与 PQC 等待 WebCrypto 支持 ML-KEM 是同一个节奏(见迁移清单)。

相关阅读