参考资料
库
共 59 个库和命令行工具,记录了其中会破坏互操作性的行为——签名编码、nonce、low-S、曲线、密钥格式、JWT 默认设置——每一项都来自实际运行,而非抄自文档。
显示 59 项中的 59 项
按语言
Node.js
- @noble/curvesPaul Miller 开发的 JavaScript 椭圆曲线库,经过审计且无依赖:支持 NIST、secp256k1 和 Brainpool 曲线上的 ECDSA,以及 EdDSA、Schnorr 等——从第 2 版起,默认采用确定性签名和 low-S,并由库自行对消息计算哈希。Node.jsWebCryptoECDSAEdDSA检查版本:2.4.0 · 2026年10月20日
- ellipticFedor Indutny 的 elliptic,十年来众多浏览器 bundle 和钱包背后的纯 JavaScript ECDSA 与 EdDSA 库:默认确定性签名但不强制 low-S,输入只接受摘要,另有一份关于 P-521 上 nonce 错误、至今未关闭的安全公告。Node.jsECDSAEdDSA检查版本:6.6.1 · 2026年10月20日
- ethers.jsethers.js v6,老牌的以太坊钱包与合约 JavaScript 库:65 字节的 r‖s‖v 签名(v = 27/28),EIP-191 消息哈希,RFC 6979 nonce,并坚决拒绝 high-S 签名。Node.jsWebCryptoECDSA以太坊与比特币检查版本:6.17.0 · 2026年10月20日
- jose (panva)Filip Skokan 开发的 jose:基于 WebCrypto、无依赖的 JOSE 实现(JWS、JWE、JWK、JWKS、JWT),无需修改即可在 Node.js、浏览器、Deno、Bun 和边缘运行时中运行,支持 EdDSA 和 ML-DSA,但不支持 secp256k1。Node.jsWebCryptoJOSE 与 JWT检查版本:6.2.13 · 2026年10月20日
- jsonwebtoken (Node.js)Auth0 的 jsonwebtoken,Node.js 中安装量最大的 JWT 包:基于 node:crypto 处理 HMAC、RSA 和 ECDSA 令牌,从第 9 版起算法检查与密钥类型绑定——但不支持 EdDSA。Node.jsJOSE 与 JWT检查版本:9.0.3 · 2026年10月20日
- node-forgeDigital Bazaar 的 node-forge,纯 JavaScript 实现的 TLS、PKI 和 PKCS 工具包:支持 RSA、PKCS#12、X.509 和 Ed25519——但完全不支持 ECDSA,因此无法读取椭圆曲线密钥或证书。Node.jsEdDSA检查版本:1.4.0 · 2026年10月20日
- Node.js node:cryptoNode.js 内置的 crypto 模块:基于每个 Node.js 版本自带的 OpenSSL,提供 ECDSA、EdDSA、RSA 和后量子签名——默认使用 DER 签名和随机 nonce,且没有 low-S 策略。Node.jsECDSAEdDSA后量子检查版本:24.22.0 · 2026年10月20日
- SimpleWebAuthnMatthew Miller 开发的 SimpleWebAuthn,TypeScript 中使用最广泛的通行密钥库:提供选项生成器和响应验证器,默认要求用户验证,断言签名只接受 DER,并拒绝计数器回退。Node.jsWebCryptoWebAuthn检查版本:14.0.3 · 2026年10月20日
- viemwevm 开发的 viem,wagmi 所用的以太坊 TypeScript 接口:65 字节的 r‖s‖v 签名(v = 27/28)、EIP-191 哈希和 RFC 6979——但与 ethers 不同,它能从 high-S 签名中恢复签名者,却不能读取 EIP-2098 紧凑签名。Node.jsWebCryptoECDSA以太坊与比特币检查版本:2.57.7 · 2026年10月20日
WebCrypto
Python
- Authlib (authlib.jose)Authlib 的 JOSE 模块,是 Authlib 的 OAuth 和 OpenID Connect 客户端与服务器底层的令牌层:自 1.9 起已弃用,推荐改用 joserfc;它解码时不校验声明,而且一旦把 alg: none 列入允许的算法,就会接受它。PythonJOSE 与 JWT检查版本:1.9.1 · 2026年10月20日
- coincurveOfek Lev 的 coincurve,Bitcoin Core 所用 libsecp256k1 的 Python 绑定:默认对 SHA-256 哈希生成 DER 签名,采用 RFC 6979,签名和验证两端都严格要求 low-S,并支持可恢复签名和 BIP-340 Schnorr 签名。PythonECDSA检查版本:21.0.0 · 2026年10月20日
- JWCryptoRed Hat 的 JWCrypto,FreeIPA 和众多企业级 Python 服务使用的 JOSE 实现:完整覆盖 JWS/JWE/JWK(包括 ML-DSA),默认容差为 60 秒,alg: none 只有显式要求时才会启用。PythonJOSE 与 JWT检查版本:1.6.1 · 2026年10月20日
- py_webauthnDuo Labs 开发的 py_webauthn,Python 中作为参考实现的 WebAuthn 依赖方库:断言签名只接受 DER,计数器检查严格,但除非你明确要求,否则不强制用户验证。PythonWebAuthn检查版本:3.0.1 · 2026年10月20日
- pyca/cryptographyPython Cryptographic Authority 的 cryptography 包,Python 的标准密码学库:基于 OpenSSL 的 ECDSA,签名为 DER 格式,RFC 6979 需显式启用;支持 EdDSA、ML-KEM 和 ML-DSA,不支持 JWK。PythonECDSAEdDSA后量子检查版本:50.0.2 · 2026年10月20日
- PyJWTJosé Padilla 开发的 PyJWT,Python 中使用最广的 JWT 库:必须显式提供 algorithms 列表,alg: none 永远无法验证通过,公钥不能用作 HMAC 密钥——但过期时间是可选的,容差为零。PythonJOSE 与 JWT检查版本:2.15.1 · 2026年10月20日
- python-ecdsatlsfuzzer 维护的纯 Python ECDSA 和 EdDSA 库:除非另行指定,否则对 SHA-1 摘要生成原始 r‖s 签名;默认使用随机 nonce,换一个方法即可使用 RFC 6979;公钥为裸 x‖y。PythonECDSAEdDSA检查版本:0.19.2 · 2026年10月20日
- python-josepython-jose,至今仍常见于 FastAPI 教程的 JOSE 库:algorithms 是可选的,不支持 PS 和 EdDSA,ES256 令牌可以用 P-384 密钥签名,还有一个尚未修复的安全公告:DER 公钥可以充当 HMAC 密钥。PythonJOSE 与 JWT检查版本:3.5.0 · 2026年10月20日
- web3.py (eth-account)以太坊基金会的 web3.py,签名由 eth-account 完成:65 字节的 r‖s‖v 签名(v = 27/28),EIP-191 和 RFC 6979——而且与 viem 一样、与 ethers 不同,它能从 high-S 签名中恢复出签名者。PythonECDSA以太坊与比特币检查版本:8.0.0 · 2026年10月20日
Go
- Go crypto/ecdsa (standard library)Go 标准库中的签名相关包——crypto/ecdsa 及 crypto/x509、ed25519、mlkem 和 mldsa:对你提供的摘要生成 DER 签名,nonce 随机化且忽略你传入的 Reader,仅支持 NIST 曲线。GoECDSAEdDSA后量子检查版本:1.27.3 · 2026年10月20日
- go-ethereum cryptogo-ethereum(geth)的 crypto 包:对 32 字节哈希做 secp256k1 签名,不加消息前缀;65 字节签名中 v = 0/1;验证器拒绝 high-S,恢复则接受。GoECDSA以太坊与比特币检查版本:1.17.8 · 2026年10月20日
- go-josego-jose,Kubernetes、Vault 和 Dex 等项目使用的 Go JOSE 实现:从 v4 起解析时必须指定算法列表,签名检查与声明校验分成两次调用,容差默认为一分钟。GoJOSE 与 JWT检查版本:4.1.6 · 2026年10月20日
- go-webauthngo-webauthn,Go 的 WebAuthn 依赖方库:断言签名只接受 DER,用户验证要求由会话决定,计数器回退只报告为克隆警告,而不会让登录失败。GoWebAuthn检查版本:0.18.2 · 2026年10月20日
- golang-jwt/jwtgolang-jwt/jwt,dgrijalva/jwt-go 的社区维护后继者,也是 Go 中使用最广的 JWT 包:验证按密钥类型进行,none 只能通过显式的哨兵值启用,过期时间除非你要求,否则是可选的。GoJOSE 与 JWT检查版本:5.3.1 · 2026年10月20日
Java
- Bouncy Castle (Java)Legion of the Bouncy Castle 出品的 Java 提供程序和 PKIX 工具包:JDK 移除的所有曲线、按需启用的确定性 ECDSA、PEM 解析,以及 JVM 上最齐全的后量子签名。JavaKotlinECDSAEdDSA后量子检查版本:1.86 · 2026年10月20日
- Java JCA (SunEC, JDK 25)Java 密码体系结构(JCA)及 JDK 自带的 SunEC 提供程序,以 JDK 25 为准:默认使用 DER,另有 P1363 格式变体;nonce 随机;仅支持三条 NIST 曲线,另外还有 Ed25519、Ed448、ML-KEM 和 ML-DSA。JavaKotlinECDSAEdDSA后量子检查版本:25.0.4.1 · 2026年10月20日
- java-jwt (Auth0)Auth0 的 java-jwt:一个精简的 JWT 库,每个验证器都绑定到一个 Algorithm 对象,JWT.decode() 什么都不检查,算法只有 HS、RS 和 ES——没有 PS256,也没有 EdDSA。JavaKotlinJOSE 与 JWT检查版本:4.6.2 · 2026年10月20日
- JJWT (io.jsonwebtoken)Les Hazlewood 开发的 JJWT,广泛用于 Java 和 Android 的 JWT 库:验证密钥决定可接受的算法,未签名的令牌需要显式的 unsecured() 解析器,弱 HMAC 密钥会被直接拒绝。JavaKotlinJOSE 与 JWT检查版本:0.13.0 · 2026年10月20日
- jose4jBrian Campbell 开发的 jose4j,多款 Java 身份服务器所采用的 JOSE 库:JwtConsumer 默认屏蔽 none 并拒绝不匹配的密钥类型,但除非你加以限制,否则会接受该密钥能执行的其他任何算法。JavaKotlinJOSE 与 JWT检查版本:0.9.7 · 2026年10月20日
- Nimbus JOSE + JWTConnect2id 的 Nimbus JOSE + JWT,Spring Security 和许多 Java OAuth 服务器内部使用的 JOSE 库:处理器的密钥选择器就是算法允许列表,未签名的令牌会被拒绝,默认时钟偏差容差为 60 秒。JavaKotlinJOSE 与 JWT检查版本:10.10 · 2026年10月20日
- Tink (Java)Google 的 Java 版 Tink,围绕密钥集和模板构建的防误用密码学 API:默认签名带有其他库都无法识别的 5 字节 Tink 前缀,模板名称也看不出你得到的是哪种编码。JavaKotlinECDSAEdDSA检查版本:1.24.0 · 2026年10月20日
- WebAuthn4JWebAuthn4J,Spring Security 的通行密钥支持和 Keycloak 底层所用的 WebAuthn 验证库:用户验证没有隐藏的默认值,签名只接受 DER,计数器回退时直接判定失败。JavaKotlinWebAuthn检查版本:0.31.11.RELEASE · 2026年10月20日
.NET
- .NET System.Security.Cryptography.NET 的 System.Security.Cryptography:ECDSA 默认生成原始 r‖s(IEEE P1363)签名,这与所有基于 OpenSSL 的技术栈都不同;不内置 Ed25519;后量子类是否可用取决于操作系统。.NETECDSA检查版本:10.0.13 · 2026年10月20日
- Bouncy Castle for .NET (BouncyCastle.Cryptography)面向 .NET 的 Bouncy Castle,.NET 开发者用来补齐基类库所缺功能的托管密码学库:Ed25519 和 Ed448、在所有平台上都可用的 secp256k1、确定性 ECDSA、PGP、PEM,以及不依赖操作系统的 ML-KEM、ML-DSA 和 SLH-DSA。.NETECDSAEdDSA后量子检查版本:2.7.0 · 2026年10月20日
- Microsoft.IdentityModel (JsonWebTokenHandler)Microsoft.IdentityModel 的 JsonWebTokenHandler,ASP.NET Core 身份验证和 Microsoft Entra ID SDK 底层的 JWT 验证器:默认时钟偏差容差为五分钟,要求 exp,并接受用 P-384 密钥签名的 ES256 令牌。.NETJOSE 与 JWT检查版本:8.23.0 · 2026年10月20日
Rust
- aws-lc-rsAWS 的 aws-lc-rs,构建在 AWS-LC C 库之上、与 ring 兼容的 Rust API:FIXED/ASN1 编码常量与 ring 相同,稳定 API 中还提供 P-521、secp256k1、ML-KEM 和 ML-DSA,并可选用 FIPS 140-3 构建。RustECDSAEdDSA后量子检查版本:1.18.2 · 2026年10月20日
- jsonwebtoken (Rust)Vincent Prouillet 开发的 jsonwebtoken crate,Rust 中使用最广的 JWT 库:Algorithm 是封闭枚举,没有 none;exp 为必需;默认容差 60 秒;而且从第 10 版起,必须自行选择密码学后端。RustJOSE 与 JWT检查版本:11.1.0 · 2026年10月20日
- ringBrian Smith 开发的 ring,rustls 和众多 Web 服务器底层的 Rust 密码学库:API 刻意保持精简,由算法常量决定签名编码,私钥只支持 PKCS#8,曲线为 P-256、P-384 和 Ed25519。RustECDSAEdDSA检查版本:0.17.14 · 2026年10月20日
- RustCrypto ecdsa (p256, p384, k256)RustCrypto 的纯 Rust ECDSA 实现:ecdsa crate 加上每条曲线各一个 crate(p256、p384、p521、k256……)——默认使用 RFC 6979 和原始 r‖s,但 secp256k1 在签名和验证两端都执行 low-S,NIST 曲线则不然。RustECDSA检查版本:0.17.0 · 2026年10月20日
PHP
- firebase/php-jwtfirebase/php-jwt,PHP 中安装量最大的 JWT 包:用 Key 对象锁定算法,拒绝过短的 HMAC 密钥,但不支持 ES512 和 PS384/512,不检查颁发者和受众,而且接受用 P-384 密钥签名的 ES256 令牌。PHPJOSE 与 JWT检查版本:7.2.1 · 2026年10月20日
- lcobucci/jwtLuís Cobucci 开发的 lcobucci/jwt,Laravel Passport 和众多 PHP 框架底层的 JWT 库:每项检查都是显式的约束,没有约束时 assert() 拒绝运行,密钥长度会被强制检查——但不支持 RSA-PSS。PHPJOSE 与 JWT检查版本:5.6.1 · 2026年10月20日
- PHP openssl extensionPHP 自带的 openssl 扩展:基于所链接 OpenSSL 支持的曲线生成 DER ECDSA 签名,支持 Ed25519 和 Ed448 密钥类型;对于格式错误的输入,openssl_verify() 返回 -1——一个会被视为真的值。PHPECDSAEdDSA检查版本:8.5.11 · 2026年10月20日
- web-token (JWT Framework)Florent Morselli 开发的 JWT Framework(web-token),面向 PHP 和 Symfony 的完整 JOSE 实现:AlgorithmManager 就是允许列表,声明由单独的检查器检查,支持 RFC 7518 的全部签名算法以及 EdDSA——但不支持 ES256K。PHPJOSE 与 JWT检查版本:4.2.3 · 2026年10月20日
Ruby
- Ruby OpenSSL (openssl gem)Ruby 的 openssl gem,所有 Ruby 密码学库和 JWT 库都建立在这个绑定之上:签名为 DER 格式,格式错误的输入会抛出异常而不是返回 false,在 OpenSSL 3 上密钥不可变,并通过通用的 PKey API 支持 ML-DSA。RubyECDSAEdDSA后量子检查版本:4.0.2 · 2026年10月20日
- ruby-jwt (jwt gem)ruby-jwt,即大多数 Ruby 和 Rails 应用使用的 jwt gem:必须显式指定 algorithm,会检查密钥类型,包含 ES256K——但 EdDSA 在 3.x 中已移到单独的 gem,而且过短的 HMAC 密钥会被悄无声息地接受。RubyJOSE 与 JWT检查版本:3.3.0 · 2026年10月20日
Swift
- Apple CryptoKitApple CryptoKit,iOS 和 macOS 内置的 Swift 密码学框架:ECDSA 签名兼有原始和 DER 两种形式,Ed25519 签名是随机化的,自 26 版起支持 ML-KEM、ML-DSA 和 X-Wing,Secure Enclave 密钥在 API 中只以不透明句柄的形式出现。SwiftECDSAEdDSA后量子检查版本:macOS 27.0.1 · 2026年10月20日
- swift-cryptoswift-crypto,Apple 为 Linux 等没有 CryptoKit 的平台提供的开源 CryptoKit API:相同的 Swift 类型,底层是内置的 BoringSSL 副本——Ed25519 签名是确定性的,而 macOS 上的 CryptoKit 会将其随机化;不提供 Secure Enclave。SwiftECDSAEdDSA后量子检查版本:5.0.3 · 2026年10月20日
C
- BoringSSLGoogle 的 BoringSSL,用于 Chrome 和 Android 的 OpenSSL 分支:ECDSA 使用 DER 签名且只支持 NIST 曲线,另有 Ed25519,以及通过专用 API 提供的 ML-KEM、ML-DSA 和 SLH-DSA——没有发布版本,也不承诺稳定性。CC++ECDSAEdDSA后量子检查版本:2026-10-19-b50cad27ee80 · 2026年10月20日
- GnuTLSGnuTLS,GNU 项目的 TLS 与 X.509 库:在 NIST 曲线上生成 DER 编码的 ECDSA 签名,通过标志启用 RFC 6979,支持 Ed25519 和 Ed448——而在本次检查的发行版构建中,不支持 secp256k1,也没有可用的后量子算法。C命令行ECDSAEdDSA检查版本:3.8.13 · 2026年10月20日
- liboqs (Open Quantum Safe)liboqs,Open Quantum Safe 项目的后量子 KEM 与签名 C 库:通过同一套 API 提供 ML-KEM、ML-DSA 和 SLH-DSA,以及一长串候选算法——用作者的话说,它面向研究和原型开发。C后量子检查版本:0.16.0 · 2026年10月20日
- LibreSSLOpenBSD 的 LibreSSL,2014年从 OpenSSL 分出的分支,用于 OpenBSD 和 macOS 的系统工具:ECDSA 同为 DER 格式,密钥格式也相同;支持 Ed25519 但不支持 Ed448;通过自有 API 提供 ML-KEM;不支持 ML-DSA,也不支持 RFC 6979。C命令行ECDSAEdDSA后量子检查版本:4.3.1 · 2026年10月20日
- libsecp256k1 (Bitcoin Core)Bitcoin Core 的 libsecp256k1,secp256k1 的参考实现:签名是不透明的结构体,可序列化为紧凑格式或严格 DER;采用 RFC 6979 nonce,签名和验证两端都要求 low-S,并支持公钥恢复和 BIP-340 Schnorr 签名。CECDSA检查版本:0.5.0 · 2026年10月20日
- libsodiumFrank Denis 的 libsodium,NaCl 的可移植分支:提供验证严格的 Ed25519 签名、X25519、认证加密,以及 ML-KEM-768 和 X-Wing 混合 KEM——但完全不支持 ECDSA。CEdDSA后量子检查版本:1.0.22 · 2026年10月20日
- Mbed TLS (TF-PSA-Crypto)Mbed TLS 4.x 是嵌入式 TLS 协议栈,其密码学功能现已改由 PSA Crypto API 提供:ECDSA 签名采用原始 r‖s 格式,确定性 ECDSA 是一个单独的算法,密钥策略为每个密钥固定一种算法。CECDSA后量子检查版本:4.1.1 · 2026年10月20日
- NSS (Network Security Services)NSS,Mozilla 为 Firefox 和 Thunderbird 提供支撑的密码与 TLS 库:两个签名层的 ECDSA 编码不一致(cryptohi 使用 DER,PK11 使用原始 r‖s),仅支持 P-256 到 P-521,另有 Ed25519 和 ML-KEM。C命令行ECDSAEdDSA后量子检查版本:3.124 · 2026年10月20日
- OpenSSLOpenSSL,支撑互联网上大部分 TLS 和许多签名场景的 C 库与命令行工具:DER 签名,随机 nonce(可按需使用 RFC 6979),支持所有常见曲线,并自 3.5 起支持 ML-KEM、ML-DSA 和 SLH-DSA。COpenSSL命令行ECDSAEdDSA后量子检查版本:3.5.9 · 2026年10月20日
- wolfSSL (wolfCrypt)wolfSSL 的嵌入式 TLS 库及 wolfCrypt 密码库:ECDSA 对你提供的摘要签名并输出 DER,验证调用的返回码与验证结论相互独立——而功能集完全取决于构建方式。CECDSAEdDSA后量子检查版本:5.9.4 · 2026年10月20日
命令行
- GnuPG (gpg)GnuPG 2.4,gpg 背后的 OpenPGP 实现:默认生成三年后过期的 Ed25519 密钥,在 NIST、Brainpool 和 secp256k1 曲线上采用确定性的 RFC 6979 ECDSA,Ed25519 签名的对象是摘要,并且尚不支持后量子算法。命令行ECDSAEdDSA检查版本:2.4.9 · 2026年10月20日
- OpenSSH (ssh-keygen)OpenSSH 10,一套 SSH 工具,其中的 ssh-keygen 还能转换密钥并为文件和 git 提交签名:默认 Ed25519,优先采用 ML-KEM 混合密钥交换,DSA 已移除——ECDSA 签名使用 SSH 自有的 mpint 编码。命令行ECDSAEdDSA后量子检查版本:10.3p1 · 2026年10月20日