剖析JWT:原理、数学表达与实现细节
一、引言
在现代Web安全体系中,JWT(JSON Web Token)已成为分布式身份认证与授权的事实标准。很多人用过JWT,却未必理解其底层原理、数学安全性与实现细节。我将通过公式推导、流程图和时序图,尽量让我们一起理解JWT的本质。
二、JWT结构与数学表达
2.1 结构剖析
JWT由三部分组成:Header、Payload、Signature。其结构用点.
分隔:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
用数学表达:
$$ \text{JWT} = \text{Base64Url}(\text{Header}) \cdot \text{Base64Url}(\text{Payload}) \cdot \text{Base64Url}(\text{Signature}) $$
2.2 签名生成
以HS256(HMAC-SHA256)为例,其签名计算公式为:
$$ \text{Signature} = \text{HMAC}_{SHA256}(\text{secret}, \text{Header}.\text{Payload}) $$
即
$$ \text{Signature} = H(\text{secret}, m) $$
其中 $m = \text{Base64Url}(\text{Header}) + "." + \text{Base64Url}(\text{Payload})$
三、JWT的安全性与数学底层
3.1 HMAC安全性
HMAC的安全性来自于哈希函数的抗碰撞性和密钥的随机性。其本质:
$$ \operatorname{HMAC}(K, m) = H\left((K' \oplus opad) \parallel H((K' \oplus ipad) \parallel m)\right) $$
- $K'$:密钥填充到哈希块大小
- $opad$、$ipad$:外部、内部填充常量
3.2 非对称签名
如RS256,签名与验证过程:
$$ \text{Signature} = \operatorname{Sign}_{\text{private}}(m) $$
$$ \operatorname{Verify}_{\text{public}}(m, \text{Signature}) = \text{true/false} $$
四、JWT的工作流程
4.1 时序图(Mermaid)
4.2 流程图(Mermaid)
五、JWT的典型应用场景与陷阱
- 单点登录(SSO):跨域认证
- API认证:微服务间身份传递
常见陷阱:
- 不校验签名算法(alg: none攻击)
- 密钥泄露
- 过期时间未合理设置
六、JWT的局限与改进方向
- 不可撤销:JWT一旦签发,无法主动失效
- 载荷明文:敏感信息泄露风险
- 密钥管理:密钥泄漏即全盘皆输
改进方向:
- 引入Token黑名单
- 缩短有效期,配合Refresh Token
- 加密Payload(JWE)