3. JWT 签名算法:HMAC、RSA 与 ECDSA 原理与对比

JWT 的签名机制是保证令牌完整性与可信性的核心。根据密钥的使用方式,主流签名算法分为三类:HMAC(对称签名)、RSA(非对称签名) 和 ECDSA(椭圆曲线签名)。理解它们的数学原理、性能特征与安全边界,是设计高并发分布式鉴权系统的前提。

3.1 算法分类与核心原理

算法族 JWT 头 alg 值 密钥类型 签名/验签密钥 核心数学原理
HMAC HS256 / HS384 / HS512 对称密钥 签名与验签使用同一个密钥 基于哈希的消息认证码,结合密钥与哈希函数(SHA-256/384/512)
RSA RS256 / RS384 / RS512 非对称密钥对 私钥签名,公钥验签 大整数分解难题,模幂运算
ECDSA ES256 / ES384 / ES512 非对称密钥对 私钥签名,公钥验签 椭圆曲线离散对数难题,点乘与标量乘法
关键区别: HMAC 是对称结构,密钥分发与管理风险较高;RSA 与 ECDSA 是非对称结构,私钥仅存于签发端,公钥可安全下发给所有验证服务。

3.2 HMAC 对称签名

HMAC(Hash-based Message Authentication Code)将密钥与消息混合后,通过哈希函数生成固定长度的摘要。JWT 中 HMAC 的签名过程可简化为:

signature = HMAC_SHA256( base64url(header) + "." + base64url(payload), secret )
  • 优点:计算速度极快,延迟低,适合内部微服务间高吞吐场景。
  • 缺点:密钥必须共享给所有验证方,一旦泄露,攻击者可伪造任意令牌;密钥轮换需要同步所有节点。
  • 适用场景:单服务鉴权、网关与后端之间受信任的内网通信。
安全警告: 在分布式系统中,如果多个服务都需要验证 JWT,HMAC 意味着每个服务都持有完整的签名密钥。密钥泄露面扩大,建议仅在完全受控的网络边界内使用。

3.3 RSA 非对称签名

RSA 基于大整数因子分解的数学难题。签名时使用私钥对 JWT 的签名输入进行模幂运算;验签时使用公钥进行模幂运算并比对哈希值。

  • 优点:私钥仅由签发中心持有,公钥可公开分发,密钥管理安全;支持数字证书体系。
  • 缺点:签名与验签计算开销大,尤其是签名操作比 HMAC 慢 10~100 倍;密钥长度通常为 2048 位或 4096 位,令牌体积略大。
  • 适用场景:跨系统、跨组织的分布式鉴权,开放 API 网关,第三方应用接入。

3.4 ECDSA 椭圆曲线签名

ECDSA 使用椭圆曲线密码学,在相同安全强度下密钥长度远小于 RSA。例如,256 位椭圆曲线(P-256)提供与 3072 位 RSA 相当的安全等级。

  • 优点:密钥短(32 字节私钥,64 字节签名),计算性能优于 RSA,尤其适合移动端与 IoT 设备;签名体积小,降低网络传输开销。
  • 缺点:实现复杂度较高,需要安全的随机数生成器;部分老旧库或硬件对 ECDSA 支持不完善。
  • 适用场景:高并发微服务、移动端鉴权、资源受限的边缘节点。

3.5 签名算法性能对比

以下数据基于相同安全强度(RSA-2048 vs ECDSA P-256 vs HMAC-SHA256)在同等硬件环境下的相对基准:

指标 HMAC-SHA256 RSA-2048 ECDSA P-256
签名速度 极快(基准 1x) 慢(约 0.1x) 中等(约 0.5x)
验签速度 极快(基准 1x) 中等(约 0.3x) 快(约 0.8x)
密钥长度 32 字节(256 位) 256 字节(公钥) 32 字节(公钥)
签名体积 32 字节 256 字节 64 字节
密钥管理复杂度 高(共享密钥) 低(私钥保密) 低(私钥保密)
抗量子计算 弱 弱(易受 Shor 算法攻击) 弱(易受 Shor 算法攻击)
性能选型建议: 如果系统内所有验证方都在同一信任域且网络隔离良好,HMAC 是性能最优解。如果必须跨信任域分发令牌,优先选择 ECDSA P-256,它在安全性与性能之间取得最佳平衡。

3.6 签名与验签流程对比图

下图展示了三种算法在 JWT 签发与验证阶段的密钥使用差异:

JWT 签名算法流程对比:HMAC vs RSA vs ECDSA HMAC 对称签名 同一密钥 K 签发端:sign(header.payload, K) 验证端:verify(header.payload, K) 密钥共享,泄露风险高 RSA 非对称签名 私钥 SK / 公钥 PK 签发端:sign(header.payload, SK) 验证端:verify(header.payload, PK) 私钥保密,公钥可公开 ECDSA 椭圆曲线签名 私钥 d / 公钥 Q 签发端:sign(header.payload, d) 验证端:verify(header.payload, Q) 密钥短,性能优于 RSA 非对称算法(RSA/ECDSA)允许验证服务仅持有公钥,即使公钥泄露也无法伪造令牌,安全性远高于 HMAC

3.7 选型决策树

在实际架构设计中,可按照以下逻辑快速选择签名算法:

  1. 所有验证方是否在同一信任域且网络隔离? 是 → 优先 HMAC(性能最优);否 → 进入下一步。
  2. 是否需要兼容老旧系统或 PKI 证书体系? 是 → 选择 RSA-2048;否 → 进入下一步。
  3. 是否对令牌体积与验签延迟敏感? 是 → 选择 ECDSA P-256;否 → RSA 或 ECDSA 均可。
生产建议: 新系统推荐默认使用 ES256(ECDSA P-256)。它在提供非对称安全优势的同时,签名体积比 RSA 小 75%,验签速度快 2~3 倍,是分布式鉴权场景的现代首选。