文章目录
-
- [一、JWT(JSON Web Token)------课程核心知识线](#一、JWT(JSON Web Token)——课程核心知识线)
-
- [1️⃣ 什么是 JWT(专业表述)](#1️⃣ 什么是 JWT(专业表述))
- [2️⃣ JWT 的组成结构(非常关键)](#2️⃣ JWT 的组成结构(非常关键))
- [3️⃣ JWT 的生成机制(逻辑而不是代码)](#3️⃣ JWT 的生成机制(逻辑而不是代码))
- [二、JWT 的代码实现(你笔记的技术部分)](#二、JWT 的代码实现(你笔记的技术部分))
- [三、JWT 身份认证的"安全本质"](#三、JWT 身份认证的“安全本质”)
-
- [1️⃣ JWT 的身份验证机制](#1️⃣ JWT 的身份验证机制)
- [2️⃣ JWT 的两大致命安全问题(第 40 课重点)](#2️⃣ JWT 的两大致命安全问题(第 40 课重点))
-
- [❌ 问题一:密钥泄露](#❌ 问题一:密钥泄露)
- [❌ 问题二:alg = none](#❌ 问题二:alg = none)
- [3️⃣ 攻击方式本质(非常重要)](#3️⃣ 攻击方式本质(非常重要))
- [4️⃣ 正确的防御方式(课程结论)](#4️⃣ 正确的防御方式(课程结论))
- [四、SpringBoot 打包与部署(安全视角总结)](#四、SpringBoot 打包与部署(安全视角总结))
-
- [1️⃣ Jar 与 War 的本质区别](#1️⃣ Jar 与 War 的本质区别)
- [2️⃣ Jar 打包流程](#2️⃣ Jar 打包流程)
- [3️⃣ War 打包流程(核心步骤)](#3️⃣ War 打包流程(核心步骤))
- [五、JavaEE 源码与反编译(安全意识)](#五、JavaEE 源码与反编译(安全意识))
-
- [1️⃣ JavaEE 源码架构认知](#1️⃣ JavaEE 源码架构认知)
- [2️⃣ 反编译的基本现实](#2️⃣ 反编译的基本现实)
- 六、【总结性安全思路】------这是你真正要记住的
一、JWT(JSON Web Token)------课程核心知识线
1️⃣ 什么是 JWT(专业表述)
JWT(JSON Web Token)是一种无状态身份认证机制 ,由服务端使用加密算法对 Token 内容进行签名 ,用于保证数据的完整性与不可伪造性。
其核心特点是:
- 服务端不保存会话状态
- 所有身份信息都放在 Token 中
- 服务端通过密钥 + 算法来验证 Token 的合法性
👉 在 Web 安全中,JWT 是身份鉴权的"信任根"。
2️⃣ JWT 的组成结构(非常关键)
JWT 由三部分组成,用 . 连接:
Header.Payload.Signature
Header(头部)
- 描述签名算法和 Token 类型
- 常见字段:
-
alg:签名算法(如 HS256) -
typ:JWT{
"alg": "HS256",
"typ": "JWT"
}
-
Payload(载荷)
- 存储用户身份数据
- 常见内容:
- 用户 ID
- 用户名
- 角色、权限
- 默认不加密,仅 Base64 编码
⚠️ Payload 里的内容不等于安全,只等于"可验证"
Signature(签名)
-
由以下三者生成:
base64(header) + "." + base64(payload) + 密钥 -
用于防止 Token 被篡改
👉 Signature 是 JWT 安全性的唯一保障
3️⃣ JWT 的生成机制(逻辑而不是代码)
JWT 的生成流程本质是:
- 构造 Header(声明算法)
- 构造 Payload(身份数据)
- 使用密钥 + 算法生成 Signature
- 拼接成完整 Token
只要密钥不泄露,攻击者无法伪造合法 JWT
二、JWT 的代码实现(你笔记的技术部分)
1️⃣ 引入依赖(java-jwt)
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.0</version>
</dependency>
2️⃣ 创建 JWT(生成)
JWT.create()
.withHeader(map)
.withClaim("userid", id)
.withClaim("username", user)
.withClaim("password", pass)
.sign(Algorithm.HMAC256("xiaodisec"));
专业理解:
withClaim→ 写入身份断言Algorithm.HMAC256("xiaodisec")→ 密钥即身份信任根
3️⃣ JWT 的解析与验证(解密)
JWTVerifier jwt = JWT.require(Algorithm.HMAC256("xiaodisec")).build();
DecodedJWT verify = jwt.verify(jwtdata);
Integer userid = verify.getClaim("userid").asInt();
注意:
- JWT 并不是"解密"
- 而是:重新计算签名 → 对比是否一致
4️⃣ jwt.io 的意义(安全视角)
- jwt.io 可以:
- Base64 解码 Header / Payload
- 验证签名是否匹配
- 但前提是:你知道密钥
👉 jwt.io 本质是一个验证与分析工具,而不是破解工具
三、JWT 身份认证的"安全本质"
1️⃣ JWT 的身份验证机制
JWT 的身份验证只依赖一件事:
服务端是否使用"正确的算法 + 正确的密钥"进行校验
只要其中任何一个出问题:
- 身份认证直接失效
2️⃣ JWT 的两大致命安全问题(第 40 课重点)
❌ 问题一:密钥泄露
- 攻击者可以:
- 任意伪造 Token
- 直接伪装管理员
- 属于完全失守
❌ 问题二:alg = none
-
如果后端允许:
{ "alg": "none" } -
则 JWT 变成:
- 无签名 Token
- 任意内容都被信任
👉 这属于设计级漏洞
补充:对于JWT中的非对称加密和对称加密方式主要使用的是它们的密钥,也就是signature中的,这样也会造成jwt的密钥混淆问题
3️⃣ 攻击方式本质(非常重要)
攻击者可以:
- 抓包
- 修改 Header 中的
alg - 删除 Signature
- 发送伪造 JWT
如果后端:
- 不校验算法
- 或接受
none
➡️ 密钥直接失效
4️⃣ 正确的防御方式(课程结论)
后端必须:
- 强制指定算法
- 显式拒绝
alg = none
示意逻辑:
parser.require("alg").isNotNone();
四、SpringBoot 打包与部署(安全视角总结)
1️⃣ Jar 与 War 的本质区别
| 类型 | 本质 |
|---|---|
| jar | 内置 Tomcat,自运行 |
| war | 依赖外部 Tomcat |
2️⃣ Jar 打包流程
mvn clean packagejava -jar xxx.jar
常见错误:
- 没有主清单属性
- 找不到主类
原因:
pom.xml缺少<mainClass><skip>true</skip>跳过清单生成
3️⃣ War 打包流程(核心步骤)
-
<packaging>war</packaging> -
主类:
extends SpringBootServletInitializer
-
重写:
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(主类.class);
} -
mvn clean package -
放入
tomcat/webapps
五、JavaEE 源码与反编译(安全意识)
1️⃣ JavaEE 源码架构认知
- 默认不存在源码下载风险
- 即使泄露:
- 仍需反编译
- 可读性受影响
2️⃣ 反编译的基本现实
- jar/war 可解压
BOOT-INF中可看到.class- 通过 IDEA / 工具反编译
👉 所以:
不要把"前端不可见"当成安全保障
六、【总结性安全思路】------这是你真正要记住的
本课可以压缩成三句话:
1️⃣ JWT 的安全性 = 密钥 + 算法的绝对可信
2️⃣ JWT 的攻击,本质是破坏"签名可信链"
3️⃣ 开发错误 ≠ 功能问题,而是直接身份失守
从渗透角度的最终思维模型
当你看到 JWT:
- 密钥在哪里?
- alg 是否可控?
- 是否允许 none?
- 后端是否强制校验?