小迪第40天:安全开发-JavaEE应用&SpringBoot框架&JWT身份鉴权&打包部署JAR&WAR

文章目录

    • [一、JWT(JSON Web Token)------课程核心知识线](#一、JWT(JSON Web Token)——课程核心知识线)
      • [1️⃣ 什么是 JWT(专业表述)](#1️⃣ 什么是 JWT(专业表述))
      • [2️⃣ JWT 的组成结构(非常关键)](#2️⃣ JWT 的组成结构(非常关键))
      • [3️⃣ JWT 的生成机制(逻辑而不是代码)](#3️⃣ JWT 的生成机制(逻辑而不是代码))
    • [二、JWT 的代码实现(你笔记的技术部分)](#二、JWT 的代码实现(你笔记的技术部分))
      • [1️⃣ 引入依赖(java-jwt)](#1️⃣ 引入依赖(java-jwt))
      • [2️⃣ 创建 JWT(生成)](#2️⃣ 创建 JWT(生成))
      • [3️⃣ JWT 的解析与验证(解密)](#3️⃣ JWT 的解析与验证(解密))
      • [4️⃣ jwt.io 的意义(安全视角)](#4️⃣ jwt.io 的意义(安全视角))
    • [三、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 的生成流程本质是:

  1. 构造 Header(声明算法)
  2. 构造 Payload(身份数据)
  3. 使用密钥 + 算法生成 Signature
  4. 拼接成完整 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 package
  • java -jar xxx.jar

常见错误:

  • 没有主清单属性
  • 找不到主类

原因:

  • pom.xml 缺少 <mainClass>
  • <skip>true</skip> 跳过清单生成

3️⃣ War 打包流程(核心步骤)

  1. <packaging>war</packaging>

  2. 主类:

    extends SpringBootServletInitializer

  3. 重写:

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
    return builder.sources(主类.class);
    }

  4. mvn clean package

  5. 放入 tomcat/webapps


五、JavaEE 源码与反编译(安全意识)

1️⃣ JavaEE 源码架构认知

  • 默认不存在源码下载风险
  • 即使泄露:
    • 仍需反编译
    • 可读性受影响

2️⃣ 反编译的基本现实

  • jar/war 可解压
  • BOOT-INF 中可看到 .class
  • 通过 IDEA / 工具反编译

👉 所以:

不要把"前端不可见"当成安全保障


六、【总结性安全思路】------这是你真正要记住的

本课可以压缩成三句话:

1️⃣ JWT 的安全性 = 密钥 + 算法的绝对可信

2️⃣ JWT 的攻击,本质是破坏"签名可信链"

3️⃣ 开发错误 ≠ 功能问题,而是直接身份失守


从渗透角度的最终思维模型

当你看到 JWT:

  • 密钥在哪里?
  • alg 是否可控?
  • 是否允许 none?
  • 后端是否强制校验?

相关推荐
爱吃香蕉的阿豪3 小时前
NET Core中ConcurrentDictionary详解:并发场景下的安全利器及服务端实践
安全·http·.netcore·高并发
Qiuner3 小时前
Spring Boot AOP(三) 通知执行链源码解析
java·spring boot·后端
汽车通信软件大头兵4 小时前
信息安全--安全XCP方案
网络·安全·汽车·uds
老猿讲编程4 小时前
【车载信息安全系列2】车载控制器中基于HSE的多密钥安全存储和使用
网络·安全
武昌库里写JAVA4 小时前
Java设计模式-(创建型)抽象工厂模式
java·vue.js·spring boot·后端·sql
唐僧洗头爱飘柔95275 小时前
【软考:程序员(03)】如何考得程序员证书?本片知识点:文件目录、目录结构、文件路径、文件命名规则、系统安全、用户权限、作业调度、用户界面
安全·系统安全·文件管理·用户界面·用户权限·作业调度算法·文件命名规则
yesyesyoucan6 小时前
安全工具集:一站式密码生成、文件加密与二维码生成解决方案
服务器·mysql·安全
memgLIFE12 小时前
Springboot 分层结构
java·spring boot·spring
yangminlei12 小时前
springboot pom.xml配置文件详细解析
java·spring boot·后端