该过程(§3.2)用私钥和对群的阶取模后的哈希(int2octets(x) ‖ bits2octets(h1))为 HMAC 提供种子,执行 HMAC-DRBG 的更新步骤,并不断抽取候选值,直到某个值落在 1…q−1 范围内。同一密钥和同一消息总是得到相同的 k,因此签名也逐字节相同。验证者无法区分:输出就是普通的 ECDSA 或 DSA 签名。
FIPS 186-5 以“确定性 ECDSA”之名批准了该方法(§6.3.2、附录 A.3.3)。它消除了随机数生成器缺陷造成的失败——PlayStation 3 以及许多钱包密钥泄露事件的根源,还让测试向量可以复现:RFC 6979 附录 A.2 提供了 DSA、NIST P 曲线以及 K 曲线和 B 曲线的测试向量。
代价是更容易受到故障攻击和侧信道攻击:在人为注入故障的情况下对同一消息签名两次,可能泄露密钥,因此对冲变体会在同一派生过程中混入额外的随机性(§3.6 允许附加数据)。各库的开关:OpenSSL 3.2 及更高版本使用 -pkeyopt nonce-type:1;Python cryptography 使用 ec.ECDSA(hashes.SHA256(), deterministic_signing=True);@noble/curves 默认进行确定性签名,并提供用于对冲的 extraEntropy 选项。