ecdsa 用纯 Python 实现 ECDSA 和 EdDSA,底层不依赖 OpenSSL。因此它在任何环境下都很容易安装,适合用于测试向量和教学,而且仍是 python-jose 等较老 JOSE 技术栈的依赖。它的维护者声明,该库并非为抵御侧信道攻击而设计,因此生产环境中的签名应交给 pyca/cryptography 或 coincurve。
几乎所有互操作失败都源于三个默认设置。哈希默认为 SHA-1:不指定 hashfunc 创建的 SigningKey 对 SHA-1 摘要签名——本次检查用 pyca/cryptography 验证默认签名,证实了这一点:用 SHA-1 验证通过,用 SHA-256 则失败。签名是原始 r‖s(在 P-256 上为 64 字节),而不是 DER。此外,VerifyingKey.to_string() 返回不带 0x04 前缀的 64 字节裸 x‖y,OpenSSL、Go 和 WebCrypto 都不会把它当作一个点来读取。
除非调用 sign_deterministic(),否则签名使用随机 nonce;该方法复现了 RFC 6979 的 P-256 测试向量。除非选用某个 *_canonize 编码器,否则 s 保持计算出的原值——大约一半的签名是 high-S——验证时两个半区都接受。每种编码选择都在每次调用时通过 sigencode= 和 sigdecode= 指定,因此签名方和验证方必须指定同一对;把 DER 签名交给默认的原始格式解码器,会抛出 BadSignatureError: Malformed formatting of signature。
它的曲线支持是 Python 库中最广的——P-224 到 P-521、secp256k1 和 Brainpool——另外还有 Ed25519 和 Ed448。密钥可以以 SPKI PEM 或 DER、SEC1 点和原始标量的形式导入;除非传入 format="pkcs8",否则 to_pem() 写出 SEC1 EC PRIVATE KEY。
示例一次性修正了全部三个默认设置:SHA-256、确定性 nonce,以及规范的 low-S DER 签名。要拿它生成的签名与其他库对照检查,最快的途径是 DER ⇄ 原始格式转换器和测试向量。