jwt学习随笔
字数 1756 2025-08-10 17:51:54
JSON Web Token (JWT) 安全学习文档
1. JWT 基本概念
JWT (JSON Web Token) 是一种基于 JSON 格式的 Web 令牌,用于在各方之间安全地传输信息。主要特点包括:
- 使用 JSON 格式存储数据
- 将用户信息加密到 token 中
- 服务器不保存任何用户信息,只保存密钥
- 通过特定加密算法验证 token
- 可替代传统的 cookie/session 身份验证机制
2. JWT 结构组成
JWT 由三部分组成,用点号(.)连接:
header.payload.signature
2.1 Header (头部)
包含两个主要字段:
alg:声明使用的加密算法,常见值:HS256:HMAC SHA-256RS256:RSA SHA-256
typ:声明类型,固定为JWT
可选字段:
kid:密钥 ID (Key ID),用于指定加密密钥jku:JWK Set URL,指定获取密钥的 URLx5u:X.509 URL,指定获取证书的 URL
示例:
{
"alg": "HS256",
"typ": "JWT"
}
2.2 Payload (负载)
包含用户数据和权限声明,分为三类声明:
- 注册声明 (预定义)
- 公共声明
- 私有声明
常见字段:
iss(Issuer):签发者sub(Subject):主题aud(Audience):接收方exp(Expiration Time):过期时间nbf(Not Before):生效时间iat(Issued At):签发时间jti(JWT ID):唯一标识
2.3 Signature (签名)
用于验证 token 的完整性,防止数据篡改。
生成方法:
signature = HMAC-SHA256(
base64urlEncode(header) + "." +
base64urlEncode(payload),
secret_key
)
3. JWT 工作流程
- 用户登录,服务器验证凭证
- 服务器生成 JWT 并返回给客户端
- 客户端存储 JWT (通常在 localStorage 或 cookie 中)
- 客户端在后续请求中携带 JWT (通常在 Authorization 头中)
- 服务器验证 JWT 并处理请求
4. JWT 安全攻击手法
4.1 修改加密算法攻击
4.1.1 None 算法攻击
- 将
alg字段设置为none - 将 signature 置为空
- 利用开发环境配置不当或生产环境误开启调试模式
4.1.2 RSA 转 HMAC 算法攻击
- 将
alg从RS256修改为HS256 - 使用收集到的 HMAC 公钥作为 RSA 私钥
- 服务器可能错误地使用 RSA 公钥验证 HMAC 签名
4.2 密钥爆破攻击
条件:
- 已知加密算法类型
- 拥有一个已签名的 JWT
- 密钥复杂度不高
4.3 修改 kid 参数攻击
kid (Key ID) 是可选参数,用于指定加密密钥,可能引发以下漏洞:
4.3.1 任意文件读取
- 利用
kid参数读取服务器文件系统 - 如:
"kid": "../../../../etc/passwd"
4.3.2 SQL 注入
kid参数从数据库读取密钥时未过滤- 构造恶意 SQL 语句
4.3.3 命令注入
- 后端使用 Ruby 的
open函数读取密钥时 - 构造系统命令
4.4 修改 jku 或 x5u 参数攻击
- 类似
kid参数攻击 jku:指定远程 JWK Setx5u:指定远程 X.509 证书
4.5 信息泄露
- Payload 部分仅进行 base64url 编码,相当于明文
- 可能泄露敏感信息
5. JWT 安全最佳实践
- 严格验证算法:拒绝
none算法,不信任客户端指定的算法 - 密钥管理:
- 使用强密钥
- 定期轮换密钥
- 保护私钥不被泄露
- 参数过滤:
- 对
kid、jku、x5u等参数进行严格过滤 - 限制文件系统访问
- 对
- 设置合理有效期:使用
exp字段设置短期有效的 token - 敏感信息保护:不要在 payload 中存储敏感信息
- HTTPS 传输:防止中间人攻击
- 签名验证:始终验证签名完整性
6. 总结
JWT 提供了一种无状态的认证机制,但不当的实现会导致严重的安全问题。开发人员需要充分理解 JWT 的工作原理和安全风险,遵循最佳实践来保障系统安全。同时,安全测试人员可以利用上述攻击手法对 JWT 实现进行安全评估。