跳到主要内容
ecdsa.com

签名延展性

签名方案或其编码的一种性质:任何人无需知道私钥,就能把一个有效签名变成同一消息、同一密钥下另一个不同的有效签名。
其他写法transaction malleabilitysignature malleation

ECDSA 在设计上就具有延展性,因为 (r, s) 和 (r, n − s) 都能通过验证;如果解析器接受非最小长度或带填充的整数,其 DER 编码还会带来更多变体(比特币的 BIP 66 严格 DER 规则在2015年消除了这一点)。如果验证者跳过 S 是否小于群的阶的检查,EdDSA 也具有延展性。延展性不等于伪造:没有人能对新消息签名。

当签名本身或涵盖签名的哈希被用作标识符时,延展性就会带来问题。在 SegWit 之前,比特币交易 ID 的哈希计算涵盖签名,因此第三方可以更改待确认交易的 ID(Mt. Gox 在2014年2月暂停提款时就援引了这一点)。记录已用签名而不是已用 nonce 的智能合约,以及按签名对请求去重的 API,也会以同样的方式出问题。

防御措施:规范编码(严格 DER、low-S、S 小于 L),由被签名的内容而不是签名计算出的标识符,被签名载荷中的显式 nonce,以及在严格验证时具备强不可伪造性的方案,例如 Ed25519 和 BIP-340。

标准与参考资料

全部术语