--- title: "JWT 安全实践:算法选择、kid 注入与签名校验" keywords: - JWT - alg none - kid 注入 - JWK - 签名校验 - 最佳实践 description: "总结 JWT 在生产中的常见风险与最佳实践,包括禁用 alg=none、稳健的签名算法选择、kid/JWK 处理与签名严格校验。" categories: - 文章资讯 - 技术教程 --- # 概述 JWT 广泛应用于 REST API 与 OIDC/OAuth2 等场景。常见攻击点包括:启用 `alg=none`、不严格的签名校验、弱密钥与 `kid` 文件/命令注入、嵌入式 JWK 被不当信任等。本文给出防护要点与工程建议。 # 关键风险 - `alg=none`:将 Header 的 `alg` 改为 `none` 并省略签名,可导致令牌伪造;必须在服务端禁用并拒绝[参考1,2,5]。 - `kid` 注入:未校验的 `kid` 被拼接到文件路径或传入不安全函数,可能触发 LFI/RCE;`kid` 仅作为安全查找键,需白名单与严格校验[参考2]。 - JWK 头部嵌入信任:若允许头部嵌入的 JWK 被直接信任,攻击者可替换为自己的公钥并签名伪造;必须仅信任服务端配置的密钥集合[参考3]。 - 弱密钥/密钥泄露:HMAC 弱密钥易被爆破;私钥泄露导致全面伪造。 # 最佳实践 - 明确签名算法:仅接受固定算法(如 `RS256`/`ES256`),拒绝 `none` 与算法切换;同时在库层禁用 `none` 支持[参考1,2,5]。 - 严格校验签名:校验签名与发行方(`iss`)、受众(`aud`)、过期(`exp`)、唯一标识(`jti`)与不可用时间(`nbf`)[参考4]。 - 安全处理 `kid`:使用白名单映射到密钥仓库,不拼接文件路径、不传入系统命令;避免将 `kid` 直接用于文件读取或数据库查询。支持旋转时确保新旧密钥并存期的安全性[参考2]。 - JWK/JWKS:仅从可信端点加载并缓存;头部嵌入的 JWK 一律拒绝;验证证书链与签名来源[参考3]。 - 存储与传输:令牌仅包含必要最小信息,不含敏感数据;避免长期有效期;支持主动吊销(黑名单/令牌版本)。 # 参考与验证 - [参考1]博客园:JWT 认证攻击与 `alg=none` 漏洞演示与修复建议:https://www.cnblogs.com/backlion/p/16699442.html - [参考2]博客园:JWT 攻击手册(`kid` 注入场景与防护、签名算法选择):https://www.cnblogs.com/xiaozi/p/12031111.html - [参考3]FreeBuf:JWT 安全性分析与嵌入 JWK 信任风险讨论(含 CVE 案例):https://www.freebuf.com/vuls/219056.html - [参考4]安全博客:JWT 声明字段与校验清单(`iss/aud/exp/nbf/jti`):https://www.secpulse.com/archives/194478.html - [参考5]技术笔记:`alg=none` 漏洞原理与演示与修复建议:https://si1ent.xyz/2020/10/21/JWT安全与实战 # 关键词校验 关键词聚焦 JWT 风险与防护,与正文一致。

发表评论 取消回复