本文目录导读:

JWT(JSON Web Token)的签名算法主要分为三大类:对称签名(HMAC)、非对称签名(RSA/ECDSA/EdDSA) 以及 不签名(none),下面详细说明各类算法及其特点。
对称签名算法(HMAC)
- 原理:使用同一个密钥(Secret Key)进行签名和验签。
- 常见算法:
HS256(HMAC with SHA-256)HS384(HMAC with SHA-384)HS512(HMAC with SHA-512)
- 特点:
- ✅ 速度快,计算资源消耗小。
- ❌ 密钥管理风险:发行方和验证方必须共享同一个密钥,任何一方泄露密钥都会导致伪造签名。
- 适用场景:
- 微服务间信任通信(如内部API网关)。
- 单服务器应用(方便密钥存储)。
非对称签名算法(RSA / ECDSA / EdDSA)
- 原理:使用私钥(Private Key)签名,公钥(Public Key)验签。
- 常见算法:
- RS256 / RS384 / RS512(基于RSA + SHA)
- ES256 / ES384 / ES512(基于ECDSA + SHA,推荐使用P-256/P-384/P-521曲线)
- EdDSA(如Ed25519,较新但高效安全)
- 特点:
- ✅ 公钥可公开分发,私钥仅发行方持有,安全性高。
- ✅ 适合多方验证(如OAuth 2.0授权服务器、OpenID Connect)。
- ❌ 相对慢于HMAC,但现代硬件可忽略差距。
- 适用场景:
- 第三方应用需要验证JWT(如单点登录SSO)。
- 跨组织、跨服务认证。
特殊或不推荐使用的算法
none(无签名算法):alg: "none"- 应当禁用!攻击者可以伪造任意JWT而无须密钥。
- 一些旧库可能默认接受甚至允许
none,导致安全漏洞(如CVE-2015-9235)。
RSASSA-PSS(如PS256/PS384/PS512):比RS256更安全(使用概率签名,抗某些攻击),但兼容性略低。
RSA-OAEP:用于JWE(JWT加密),而非JWS签名。
推荐选择策略
| 场景 | 推荐算法 | 原因 |
|---|---|---|
| 内部服务间通信(共享密钥) | HS256 | 速度快,简单 |
| 面向第三方验证(如SSO) | RS256 或 ES256 | 安全分发公钥,私钥不外泄 |
| 高性能移动端/嵌入式设备验签 | ES256(ECDSA) | 签名短,计算量小于RSA |
| 极高安全要求且支持现代算法 | EdDSA(如Ed25519) | 抗量子计算(部分),签名短,性能好 |
| 任何情况 | 禁用 none 和弱算法 |
避免伪造攻击 |
JWT头中的 alg 字段示例
{
"alg": "RS256",
"typ": "JWT"
}
解码后的Header(Base64)会直接指示验证方式。务必在验证时强制校验alg字段,防止算法替换攻击(Algorithm Substitution Attack)。
关键安全提示
- 绝不信任
alg: none:验证时若遇到none应直接拒绝。 - 显式指定允许的算法:在验证逻辑中编写白名单(如只允许
["RS256"]),避免降级攻击。 - 密钥管理:HMAC密钥需定期轮换,RSA/ECDSA私钥需严格保护。
- 使用标准库:如
jsonwebtoken(Node.js)、PyJWT(Python)、jjwt(Java)等,避免自己实现签名/验证。