JSON Web 令牌(JWT)

security OpenTrojan Threat Intelligence

JWT 作为无状态令牌格式:结构、签名验证、常见漏洞(算法混淆、时钟偏移、密钥泄露)与缓解。

快速解答

JWT 是一种签名令牌;如果签名无法用预期密钥验证通过、算法被污染/混淆(例如 'none' 或算法不匹配)、签发方/受众错误,或令牌已过期,则应拒绝该令牌。

定义

JWT 是一种紧凑的、已签名的声明令牌(header.payload.signature),主要用作无状态的不记名令牌;其安全性完全取决于严格的签名验证和短生命周期。

它是什么

JSON Web 令牌(RFC 7519)是一种紧凑、URL 安全的令牌,由三个 base64url 部分——头部、载荷、签名——组成,通常用作 API 和 SSO 中的无状态不记名令牌(参见 security:oauth-saml-sso)。

为什么重要

无状态性很方便,但 JWT 唯一真正的安全边界是它的签名。如果某个库或应用程序在未验证签名的情况下信任令牌、接受错误的算法,或使用已泄露或被攻击者控制的签名密钥,任何人都可以铸造携带任意声明的令牌。

它如何工作

  • header(头部):令牌类型和签名算法(alg)。
  • payload(载荷):声明——签发方(iss)、受众(aud)、主体(sub)、过期时间(exp)、签发时间(iat)。
  • signature(签名):HMAC(对称共享密钥)或非对称(RSA/ECDSA 公钥)。

检测

  • alg: none 或头部与预期密钥类型之间的算法不匹配(算法混淆)。
  • 接受 exp 在过去或根本没有过期时间的令牌。
  • iss/aud 与预期的身份提供商 / 依赖方不匹配。
  • 两个用户共享一个对称签名令牌(表明共享密钥已泄露)。

缓解

  • 使用预期的算法和密钥验证签名;绝不接受 alg: none 或回退到不受信任的算法。
  • 验证 iss、aud、sub、exp 和 iat;拒绝已过期和过早签发(时钟偏移)的令牌。
  • 使用非对称签名,使秘密材料仅保留在签名方;轮换密钥。
  • 不要记录令牌;它们是凭据(bearer credentials)。

调查

解码 JWT(仅头部/载荷,绝不处理签名)以检查 alg/声明并确认验证缺口,然后审查签发方的密钥服务和令牌历史日志。使用 guides:tool-jwt-guide 安全解码,使用 guides:decode-jwt-safely 了解安全流程。

参考资料

还有后续问题?

向 OpenTrojan 证据驱动的助手询问本主题——回答会引用其来源。

就此向 AI 提问 发起调查