jwt 令牌如何保证安全 - jwt 验证 - jwt 安全

JWT 令牌如何安全?开发人员容易忽视的常见验证缺陷

要回答 JWT 令牌如何安全的问题,答案是:只有每个验证步骤都正确完成,才能保证其安全性。JWT(JSON Web 令牌)的核心是使用加密签名来确保令牌由可信来源颁发且未被篡改。正确实施后,这提供了一种无状态的方式来验证用户和服务。但问题在于:JWT 默认并不安全。它们的安全性完全取决于您如何处理 JWT 验证。

令牌本身并不神奇。它只是一个 Base64编码 JSON 结构包含标头、有效负载和签名。保护它的是适当的验证。跳过或错误配置任何部分,都相当于发放一张空白的访问卡。

这种情况比你想象的更常见。开发人员信任 JWT,因为它们看起来加密可靠,但却忘记了 JWT 验证才是真正执行规则的关键。 

JWT 验证中的危险遗漏:alg: none、Missing exp 和 aud

算法:无, 接受未签名的令牌

这个很臭名昭著。如果你的代码接受带有 算法:无,它会将未签名的令牌视为有效令牌。这彻底破坏了 JWT 的安全性。

Node.js 示例:

const jwt = require('jsonwebtoken');
const token = jwt.sign({ role: 'admin' }, 'mysecret', { algorithm: 'HS256' });

// Exploit: attacker crafts token with alg: none
const fakeToken = Buffer.from(JSON.stringify({ alg: 'none', typ: 'JWT' })).toString('base64') + '.' +
Buffer.from(JSON.stringify({ role: 'admin' })).toString('base64') + '.';

jwt.verify(fakeToken, null, { algorithms: ['none'] }); // Never do this

⚠️ 教育示例,请勿在生产环境中运行

失踪 EXP、永不过期的代币

如果没有 EXP 有人声称,JWT 是永久有效的。这意味着被盗用的令牌将授予无限期的访问权限,从而破坏您的 JWT 安全态势。那么,JWT 令牌的安全性如何呢?

Python 示例:

mport jwt

payload = {"user_id": 1} # No expiration
encoded = jwt.encode(payload, "secret", algorithm="HS256")

⚠️ 教育示例,请勿在生产环境中运行

如果您跳过 EXP 检查,你实际上并没有执行完整的 JWT 验证。你只是相信一个 token 会永远表现良好。

忽略 澳元, 跨应用程序滥用

澳元 声明可确保令牌确实适用于您的服务。忽略此声明会导致令牌在非预期的地方被使用。

如果未能进行此检查,则意味着任何具有有效签名的令牌都可以访问其原本无法访问的端点。这是一个巨大的 JWT 安全漏洞。那么,JWT 令牌的安全性如何呢?

真正的 JWT 安全漏洞 CI/CD 和微服务

跨环境的秘密重用

在开发、测试和生产环境中硬编码相同的签名密钥意味着泄露开发环境的密钥,从而获得完整的生产环境访问权限。JWT 依赖于信任边界。切勿将其扁平化。这是 JWT 验证中的典型错误。

跨微服务的 JWT 验证不一致

当服务以不同的方式验证 JWT 时,攻击者可以找到最薄弱的环节。

示例:一项服务检查 EXP 以及 澳元,另一个则跳过两者。攻击者向薄弱的服务发送有效令牌以提升权限或进行内部转移。那么,当每个服务执行不同的规则时,JWT 令牌如何保证安全呢?答案是肯定的。

不安全的令牌传播

在 URL 或日志中传递 JWT 会将它们暴露给非预期的参与者。在 CI/CD令牌通常会经过多跳传输。如果任何一点记录了标头或 URL,JWT 就可能暴露,从而破坏 JWT 的安全性。

CI/CD 泄漏示例:

  • 步骤 1:通过 CLI 发送令牌以触发部署。
  • 步骤 2:CLI 工具在 GET 参数中记录带有令牌的完整 URL。
  • 步骤 3:将日志发送给第三方服务。

结果?JWT 被泄露了。

修复 Dev 和 CI 中的 JWT 验证 Pipelines

执行全面索赔检查

始终验证:

  • 签名(永不接受 算法:无)
  • EXP (到期)
  • 澳元 (观众)
  • 国际空间站 (发行人)
  • 可选的: NBF, IAT

这是强健 JWT 安全性的基础。如果您不强制执行完整的 JWT 验证,那么您将面临巨大的风险。

使用成熟的库

使用可安全失败的可信库:

  • 节点.js: jsonwebtoken, 何塞
  • Python: PyJWT, 认证库

避免自行验证。请使用内置的 JWT 验证功能。

机密管理

使用密钥管理器(Vault、AWS Secrets Manager、Doppler)来合理地轮换和限定 JWT 密钥的范围。密钥安全措施不完善会给 JWT 带来巨大的安全风险。

威胁建模 JWT 流程

In pipelines,像攻击者一样思考:

  • 令牌会在日志中泄漏吗?
  • JWT 验证在各个服务之间是否一致?
  • 我可以在不同环境中重复使用令牌吗?

询问“JWT 令牌如何安全?”应该是一个检查点,而不是一个假设。

JWT 令牌如何保证安全?跨环境和 API 保障 JWT 安全

应用策略即代码

以代码形式定义并执行令牌验证规则(例如 OPA、Kyverno)。这样,服务就无法跳过 无需警报的 JWT 验证。

在 API 网关处验证

让您的网关(例如 Kong、Envoy、AWS API Gateway)在流量到达内部服务之前强制执行 JWT 验证。这将全面提升 JWT 的安全性。

监控令牌使用情况

记录令牌的使用时间和地点。如果令牌突然跨越区域或服务,请进行标记。使用 SIEM 或行为分析进行检测。

限制令牌范围

使用短期令牌并通过声明限制范围。不要发布长期有效、权限过高的 JWT。这不符合 JWT 安全性的运作方式。

所以,JWT 验证:你的最后一道防线

JWT 令牌如何保证安全?只有你确保它们的安全。JWT 提供加密完整性,但它们本身并不强制执行安全性。大多数 JWT 验证问题都源于糟糕的实现。

常见的失误,比如接受 算法:无, 跳过 EXP or 澳元重复使用密钥,或未能跨服务进行一致验证,都会破坏 JWT 应有的信任。如果您想知道 JWT 令牌的安全性如何,请记住:只有通过严格、一致的 JWT 验证才能确保其安全。

像工具一样 西吉尼 帮助执行正确的验证,检查缺失的声明,并确保 JWT 在 DevSecOps 中的使用安全 pipeline它们暴露了真正的 JWT 安全风险,尤其是在 CI/CD 和微服务,其中令牌滥用可能会产生生产级后果。 JWT ≠ 默认是安全的。 确保验证安全或做好违规准备. 将 JWT 验证作为您的基准的一部分,而不是事后的想法。

sca-tools-软件-成分分析工具
确定软件风险的优先级、进行补救并加以保护
7-day免费试用
无需信用卡

保护您的软件开发和交付

使用 Xygeni 产品套件