systemslibrarian/crypto-lab-jwt-forge

GitHub: systemslibrarian/crypto-lab-jwt-forge

浏览器端 JWT/JWS 签名验证教学演示,通过对正确与有漏洞的验证器进行并排实验,直观展示 alg:none 和密钥混淆等结构性验证缺陷。

Stars: 0 | Forks: 0

# crypto-lab-jwt-forge ## 简介 JWT Forge 是一个用于 **JWS 签名验证**(即 JSON Web Token 的完整性层)的浏览器演练平台。它使用真实的 WebCrypto 原语对 token 进行签名和验证:**HMAC-SHA256 (HS256)**、**RSASSA-PKCS1-v1_5 (RS256)**、**ECDSA P-256 (ES256)** 以及不安全的 **`none`** 算法,并遵循 RFC 7515 (JWS) 和 RFC 7519 (JWT)。签名证明了 token 的**完整性与来源**——它*不是*加密,因此其内容对任何人都是可读的。其安全模型是混合的:HS256 是对称的(使用同一个共享密钥),而 RS256 和 ES256 是非对称的(私钥签名,公钥验证)。这个演示旨在通过将同一个伪造的 token 分别在*正确*的验证器和故意设置为*有漏洞*的验证器上运行,来具体展示两种经典的结构性验证缺陷——`alg:none` 和 HS/RS 密钥混淆。 ## 何时使用 - **无状态的服务间认证** —— 资源服务器只需凭借密钥即可验证 JWS token 的来源和完整性,无需进行会话查找,因为签名将声明与签发方绑定。 - **验证方绝对不能有权签发 token 时的非对称签名 (RS256 / ES256)** —— 只有签发方持有私钥;其他所有人都持有公钥,他们可以进行验证,但绝对无法伪造。 - **单一信任域内的对称签名 (HS256)** —— 当同一方既负责签发又负责验证,且能安全地共享密钥时,HMAC 既快速又简单。 - **当体积和速度至关重要时,优先选择 ES256 而非 RS256** —— P-256 签名比 2048 位 RSA 小得多,生成速度也快得多,这在资源受限或高并发的链路中非常有用。 - **何时不该使用:** 永远不要试图用 JWS 来*隐藏*数据——它只负责签名,不负责加密(如果需要机密性,请使用 JWE)。并且永远不要接受 `alg:none`,也不要让 token 自身的头部来决定验证算法——这正是本演示所利用的缺陷。 ## 在线演示 **[systemslibrarian.github.io/crypto-lab-jwt-forge](https://systemslibrarian.github.io/crypto-lab-jwt-forge/)** 解码并检查 token,篡改其头部和声明,替换其算法,并发起三种脚本化攻击(`alg:none`、RS/HS 密钥混淆以及作为静默篡改的对照组)。**验证策略**面板允许你设置可接受算法的白名单,选择验证器持有的密钥,并在**正确**的验证器和**有漏洞**的验证器之间切换——提供并排对比、逐步的决策追踪、引导式教程以及可分享的场景链接。本演示**仅验证签名**;它不对任何内容进行加密或解密,所有密钥均在你的浏览器中按会话生成,且永远不会离开该页面。 ## 常见隐患 - 盲目信任 token 自带的 `alg` 头部,会让攻击者得以设置 `alg:none` 并完全剥离签名。 - HS/RS 密钥混淆:如果验证器在同一路径中处理所有算法,就可能被诱骗成使用 RSA *公钥*作为 HMAC 密钥来验证 HS256 token,从而让任何人都能伪造 token。 - 将已签名的 JWT 视为机密信息——JWS 只签名不加密,因此只要拿到 token,任何人都能读取其 base64url 编码的载荷。 - 有效的签名并不等同于授权——如果跳过了对过期时间、受众或签发方声明的检查,就会让过期或发错对象的 token 蒙混过关。 - 一旦捕获到哪怕一个 token,脆弱或通用的 HS256 密钥就可以被离线暴力破解。 ## 实际用途 - 用于无状态 API 和服务间认证的 Bearer token(OAuth 2.0 和 OpenID Connect ID token)。 - 单页应用和移动客户端中的会话和访问 token。 - 非对称签名 (RS256/ES256),由一个身份提供者签发 token,众多资源服务器使用公钥进行验证。 - `alg:none` 和密钥混淆缺陷是 JWT 库及其部署环境中真实存在且被反复发现的一类漏洞。 ## 如何在本地运行 ``` git clone https://github.com/systemslibrarian/crypto-lab-jwt-forge cd crypto-lab-jwt-forge npm install npm run dev ``` ## 相关演示 - [crypto-lab-ecdsa-forge](https://systemslibrarian.github.io/crypto-lab-ecdsa-forge/) —— ES256 签名机制以及 nonce 重用是如何伪造签名的。 - [crypto-lab-rsa-forge](https://systemslibrarian.github.io/crypto-lab-rsa-forge/) —— RS256 原语及其面临的 OAEP/PSS/PKCS#1 攻击。 - [crypto-lab-ed25519-forge](https://systemslibrarian.github.io/crypto-lab-ed25519-forge/) —— 现代签名机制以及困扰实现者的验证细节问题。 - [crypto-lab-timing-oracle](https://systemslibrarian.github.io/crypto-lab-timing-oracle/) —— 为什么 HMAC 和签名校验必须采用恒定时间算法。 - [crypto-lab-padding-oracle](https://systemslibrarian.github.io/crypto-lab-padding-oracle/) —— 另一种每次利用一个字节的结构性验证缺陷。 *这是 [Crypto Lab](https://crypto-lab.systemslibrarian.dev/) 套件中 120 多个浏览器演示之一。* *“所以,你们或吃或喝,或做什么,一切都要为神的荣耀而行。” —— 哥林多前书 10:31*
标签:JWT, MITM代理, Web安全, 安全演示, 密码学, 手动系统调用, 数据可视化, 暗色界面, 漏洞复现, 自动化攻击, 蓝队分析