2. JWT 签名算法概览:对称签名(HS256)与非对称签名(RS256/ES256)的原理与适用场景
JWT(JSON Web Token)的核心安全基石在于其签名机制。签名算法决定了 Token 的防篡改能力、分发方式以及性能特征。在生产环境中,错误选择签名算法是导致密钥泄露、签名绕过等严重漏洞的常见原因。本章将深入剖析对称签名(HS256)与非对称签名(RS256/ES256)的数学原理、实现差异及选型依据。
2.1 签名算法分类与核心差异
JWT 标准(RFC 7519)定义了多种签名算法,按密钥类型可分为两大类:对称签名(HMAC 系列)和非对称签名(RSA/ECDSA 系列)。下表从密钥管理、计算性能、安全边界三个维度进行对比:
| 对比维度 | HS256(HMAC-SHA256) | RS256(RSA-SHA256) | ES256(ECDSA-SHA256) |
|---|---|---|---|
| 密钥类型 | 对称密钥(共享密钥) | 非对称密钥对(公钥 + 私钥) | 非对称密钥对(公钥 + 私钥) |
| 签名与验证 | 签名与验证使用同一密钥 | 私钥签名,公钥验证 | 私钥签名,公钥验证 |
| 计算性能 | 极快(纯哈希运算) | 较慢(大数模幂运算) | 快(椭圆曲线点乘运算) |
| 签名长度 | 固定 32 字节(256 位) | 与密钥长度相关(如 2048 位密钥产生 256 字节签名) | 固定 64 字节(256 位曲线) |
| 密钥分发难度 | 高(需安全通道传输共享密钥) | 低(公钥可公开分发) | 低(公钥可公开分发) |
| 典型适用场景 | 内部微服务、单点部署 | 开放 API、第三方集成 | 移动端、IoT、高安全要求场景 |
关键结论:HS256 适用于信任域内的服务间通信,RS256/ES256 适用于跨信任域的 Token 验证。ES256 在同等安全强度下,签名更短、性能更优,是新一代微服务架构的首选非对称算法。
2.2 对称签名:HS256 原理与风险
HS256 基于 HMAC-SHA256 算法,其核心思想是:签名方和验证方持有完全相同的密钥。签名过程将 Header、Payload 和密钥一起通过 HMAC 哈希函数计算,生成固定长度的摘要作为签名。
2.2.1 签名与验证流程
- 签名端:将 Base64URL 编码的 Header 和 Payload 拼接,使用共享密钥通过 HMAC-SHA256 计算摘要,将摘要作为签名附加到 Token 末尾。
- 验证端:使用相同的共享密钥,对接收到的 Header 和 Payload 重新计算 HMAC-SHA256 摘要,并与 Token 携带的签名进行比对。若一致,则 Token 未被篡改。
// HS256 签名伪代码
signature = HMAC-SHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
shared_secret
)
安全风险警示:HS256 要求所有验证方都必须持有共享密钥。一旦密钥泄露,攻击者可以伪造任意 Token。在分布式系统中,密钥分发和轮换是最大的运维挑战。此外,HS256 无法实现“无状态验证”中的公钥分发优势。
2.3 非对称签名:RS256 与 ES256 原理
非对称签名使用一对密钥:私钥(Private Key)用于签名,公钥(Public Key)用于验证。私钥必须严格保密,公钥可以公开分发。这一特性使得非对称签名在开放系统中具有天然的安全优势。
2.3.1 RS256(RSA-SHA256)
RS256 基于 RSA 公钥密码体制,签名过程涉及大数模幂运算。其安全性依赖于大整数分解的困难性。签名长度与密钥长度成正比,通常使用 2048 位或 4096 位密钥。
// RS256 签名伪代码
signature = RSA_SIGN(
SHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload)),
private_key
)
2.3.2 ES256(ECDSA-SHA256)
ES256 基于椭圆曲线数字签名算法(ECDSA),使用 P-256 曲线(secp256r1)。与 RSA 相比,椭圆曲线在同等安全强度下,密钥更短、计算更快、签名更紧凑。ES256 的签名长度为固定 64 字节,远小于 RS256 的 256 字节。
// ES256 签名伪代码
signature = ECDSA_SIGN(
SHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload)),
private_key // P-256 曲线私钥
)
选型建议:对于新系统,优先考虑 ES256。它提供与 RS256 同等的安全强度(128 位安全级别),但签名更短、性能更优,尤其适合移动端和 IoT 设备。RS256 适用于已有 RSA 基础设施的遗留系统。
2.4 签名算法选型决策树
下图展示了在实际项目中如何根据系统架构和安全需求选择签名算法:
2.5 算法安全性与合规性要点
- 密钥强度:HS256 密钥长度至少 256 位(32 字节);RS256 推荐 2048 位以上;ES256 使用 P-256 曲线(密钥长度 256 位)。
- 算法混淆攻击:服务端必须严格校验 JWT 的
alg头字段,防止攻击者将RS256篡改为HS256并使用公钥作为密钥进行签名验证绕过。 - 密钥轮换:对称密钥建议每 90 天轮换一次;非对称密钥建议每 180 天轮换一次。轮换期间需支持新旧密钥同时有效(密钥版本化)。
- 合规要求:金融、医疗等合规场景(如 PCI-DSS、HIPAA)通常要求使用非对称签名(RS256/ES256),以便实现审计链中的非否认性。