JWCrypto 基于 pyca/cryptography 实现了 JOSE 家族:JWK 和 JWK 集、JWS、JWE 以及 JWT。一切都以密钥对象为基础——即由 PEM、JSON 或 generate() 构建的 jwk.JWK——因此每次调用时密钥类型都是明确的。它采用 LGPL-3.0-or-later 许可证,如果你要再分发修改过的副本,这一点很重要。
它的算法覆盖面是 Python JOSE 库中最广的:HS、RS、PS 和 ES 系列,ES256K、EdDSA 以及完全指定的 Ed25519 和 Ed448;1.6.1 还支持 ML-DSA-44、ML-DSA-65 和 ML-DSA-87,使用后量子 JOSE 草案中的 AKP 密钥——它们在检查中全部签名与验证成功,而且全都在默认允许列表中。问题恰恰出在这个默认列表上:除非传入 algs,否则只要密钥匹配,其中任何算法都会被接受,因此应像示例那样,把列表缩小到颁发者实际使用的算法。
除非列出 none,否则未签名的令牌会被拒绝,报错 Algorithm not allowed;用 EC 公钥 JWK 验证 HS256 令牌会失败,因为这种密钥类型无法执行 HMAC。ES256 会拒绝 P-384 密钥,报错 Curve requested is "P-256", but key curve is "P-384"。ES256 签名是 64 字节的原始 r‖s 格式;DER 签名会报错 Verification failed for all signatures——可以在 JWT 调试器中检查编码。
有两个默认行为与其他库不同。过期检查容许 60 秒的时钟偏差:57 秒前过期的令牌仍然验证通过,63 秒前过期的则不通过——比完全不留容差的 PyJWT 或 jose 更宽松。另外,exp 是可选的:除非在 check_claims 中列出它,否则不含它的令牌也能验证通过。
可以用 JWKS 生成器构建密钥集,用 JWE 查看器查看加密令牌;对于 ML-DSA 的密钥和签名,后量子签名工具会显示涉及的大小。