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-256
    • RS256:RSA SHA-256
  • typ:声明类型,固定为 JWT

可选字段:

  • kid:密钥 ID (Key ID),用于指定加密密钥
  • jku:JWK Set URL,指定获取密钥的 URL
  • x5u: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 工作流程

  1. 用户登录,服务器验证凭证
  2. 服务器生成 JWT 并返回给客户端
  3. 客户端存储 JWT (通常在 localStorage 或 cookie 中)
  4. 客户端在后续请求中携带 JWT (通常在 Authorization 头中)
  5. 服务器验证 JWT 并处理请求

4. JWT 安全攻击手法

4.1 修改加密算法攻击

4.1.1 None 算法攻击

  • alg 字段设置为 none
  • 将 signature 置为空
  • 利用开发环境配置不当或生产环境误开启调试模式

4.1.2 RSA 转 HMAC 算法攻击

  • algRS256 修改为 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 Set
  • x5u:指定远程 X.509 证书

4.5 信息泄露

  • Payload 部分仅进行 base64url 编码,相当于明文
  • 可能泄露敏感信息

5. JWT 安全最佳实践

  1. 严格验证算法:拒绝 none 算法,不信任客户端指定的算法
  2. 密钥管理
    • 使用强密钥
    • 定期轮换密钥
    • 保护私钥不被泄露
  3. 参数过滤
    • kidjkux5u 等参数进行严格过滤
    • 限制文件系统访问
  4. 设置合理有效期:使用 exp 字段设置短期有效的 token
  5. 敏感信息保护:不要在 payload 中存储敏感信息
  6. HTTPS 传输:防止中间人攻击
  7. 签名验证:始终验证签名完整性

6. 总结

JWT 提供了一种无状态的认证机制,但不当的实现会导致严重的安全问题。开发人员需要充分理解 JWT 的工作原理和安全风险,遵循最佳实践来保障系统安全。同时,安全测试人员可以利用上述攻击手法对 JWT 实现进行安全评估。

JSON Web Token (JWT) 安全学习文档 1. JWT 基本概念 JWT (JSON Web Token) 是一种基于 JSON 格式的 Web 令牌,用于在各方之间安全地传输信息。主要特点包括: 使用 JSON 格式存储数据 将用户信息加密到 token 中 服务器不保存任何用户信息,只保存密钥 通过特定加密算法验证 token 可替代传统的 cookie/session 身份验证机制 2. JWT 结构组成 JWT 由三部分组成,用点号(.)连接: 2.1 Header (头部) 包含两个主要字段: alg :声明使用的加密算法,常见值: HS256 :HMAC SHA-256 RS256 :RSA SHA-256 typ :声明类型,固定为 JWT 可选字段: kid :密钥 ID (Key ID),用于指定加密密钥 jku :JWK Set URL,指定获取密钥的 URL x5u :X.509 URL,指定获取证书的 URL 示例: 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 的完整性,防止数据篡改。 生成方法: 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 Set x5u :指定远程 X.509 证书 4.5 信息泄露 Payload 部分仅进行 base64url 编码,相当于明文 可能泄露敏感信息 5. JWT 安全最佳实践 严格验证算法 :拒绝 none 算法,不信任客户端指定的算法 密钥管理 : 使用强密钥 定期轮换密钥 保护私钥不被泄露 参数过滤 : 对 kid 、 jku 、 x5u 等参数进行严格过滤 限制文件系统访问 设置合理有效期 :使用 exp 字段设置短期有效的 token 敏感信息保护 :不要在 payload 中存储敏感信息 HTTPS 传输 :防止中间人攻击 签名验证 :始终验证签名完整性 6. 总结 JWT 提供了一种无状态的认证机制,但不当的实现会导致严重的安全问题。开发人员需要充分理解 JWT 的工作原理和安全风险,遵循最佳实践来保障系统安全。同时,安全测试人员可以利用上述攻击手法对 JWT 实现进行安全评估。