【JavaEE安全】Spring Boot 安全实战:JWT 身份鉴权与打包部署

警告:以下内容仅用于安全研究与授权测试,未经许可的攻击行为属于违法行为。


一、JWT 身份鉴权:原理与实战

1.1 JWT 结构与工作流

JWT(JSON Web Token)是一种用于身份验证的开放标准,它将用户信息编码为 JSON 对象,并通过数字签名保证其真实性和完整性。

JWT 三部分组成

  • Header(头部):描述签名算法(如 HS256)和令牌类型。
  • Payload(负载):包含需要传递的用户数据(如 userid、username),这些信息是 Base64 编码的,并非加密。
  • Signature(签名):使用服务器密钥对 Header 和 Payload 进行签名,用于验证令牌的完整性和来源。

典型工作流

  1. 用户通过用户名/密码登录。
  2. 服务器验证凭据后,使用密钥生成 JWT 并返回给客户端。
  3. 客户端在后续请求的 Authorization 头中携带 JWT。
  4. 服务器验证 JWT 签名,提取用户信息并授权访问。

1.2 Spring Boot 集成 JWT

依赖引入

pom.xml 中添加 JWT 库:

xml 复制代码
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.4.0</version>
</dependency>
创建与签名 JWT
java 复制代码
// 生成 JWT
String createJWT(String id, String user, String pass) {
    Map<String, Object> header = new HashMap<>();
    header.put("alg", "HS256");
    header.put("typ", "JWT");

    return JWT.create()
            .withHeader(header)
            .withClaim("userid", id)
            .withClaim("username", user)
            // .withClaim("password", pass) // 实战中禁止将密码放入 Payload
            .sign(Algorithm.HMAC256("xiaodisec")); // 使用密钥签名
}
解析与验证 JWT
java 复制代码
// 解析并验证 JWT
Map<String, Object> parseJWT(String jwtdata) {
    // 构建验证器,使用相同的密钥
    JWTVerifier verifier = JWT.require(Algorithm.HMAC256("xiaodisec")).build();
    DecodedJWT jwt = verifier.verify(jwtdata);

    // 提取 Payload 中的信息
    Map<String, Object> userInfo = new HashMap<>();
    userInfo.put("userid", jwt.getClaim("userid").asInt());
    userInfo.put("username", jwt.getClaim("username").asString());
    return userInfo;
}

1.3 安全风险

  • 密钥泄露 :若签名密钥(如 xiaodisec)被攻击者获取,他们可以伪造任意 JWT,绕过身份验证。
  • 敏感信息暴露:Payload 仅为 Base64 编码,并非加密。切勿将密码等敏感信息放入 Payload。
  • 算法混淆攻击 :攻击者可将 alg 字段设为 none,诱导服务器不验证签名。

二、Spring Boot 打包部署:JAR vs WAR

2.1 JAR 包部署(推荐)

Spring Boot 默认将项目打包成可执行的 JAR 文件,内置了 Tomcat 等 Servlet 容器,开箱即用。

打包与运行

  1. 打包 :使用 Maven 命令 mvn clean package,在 target 目录生成 xxx.jar

  2. 运行 :直接使用 JDK 运行:

    bash 复制代码
    java -jar xxx.jar

    或后台运行:

    bash 复制代码
    nohup java -jar xxx.jar > log.out 2>&1 &

2.2 WAR 包部署

当需要部署到独立的 Tomcat 服务器时,需将项目打包成 WAR 文件。

配置步骤

  1. 修改 pom.xml

    xml 复制代码
    <packaging>war</packaging>
    
    <!-- 排除内置 Tomcat -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
  2. 改造启动类 :继承 SpringBootServletInitializer 以适配外部 Tomcat:

    java 复制代码
    @SpringBootApplication
    public class Application extends SpringBootServletInitializer {
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
            return builder.sources(Application.class);
        }
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
  3. 部署

    • 使用 mvn clean package 生成 xxx.war
    • 将 WAR 文件放入 Tomcat 的 webapps 目录。
    • 启动 Tomcat,服务器会自动解压并部署应用。

2.3 源码安全

JavaEE 项目部署的是编译后的字节码(.class 文件),而非源码。即使字节码文件泄露,攻击者也需要通过反编译才能获取近似的源码,增加了攻击成本。


三、总结与实战要点

  • JWT 是无状态认证的利器,但密钥管理和 Payload 内容是安全的核心。
  • JAR 包 部署简单、易于容器化,是微服务架构的首选。
  • WAR 包 适用于需要与传统 Tomcat 集群集成的场景。
  • 在渗透测试中,JWT 密钥泄露和算法篡改是常见的攻击点,而错误的部署配置(如暴露调试端口)则是另一个重要风险面。

参考链接


相关推荐
Xudde.4 小时前
班级作业笔记报告0x04
笔记·学习·安全·web安全·php
wb043072016 小时前
使用 Java 开发 MCP 服务并发布到 Maven 中央仓库完整指南
java·开发语言·spring boot·ai·maven
nbwenren8 小时前
Springboot中SLF4J详解
java·spring boot·后端
helx829 小时前
SpringBoot中自定义Starter
java·spring boot·后端
rleS IONS9 小时前
SpringBoot获取bean的几种方式
java·spring boot·后端
项目管理小胡10 小时前
2026年项目管理工具选型指南:功能对比、适用场景与避坑建议
java·python·安全·团队开发·个人开发
R***z10110 小时前
Spring Boot 整合 MyBatis 与 PostgreSQL 实战指南
spring boot·postgresql·mybatis
赵丙双11 小时前
spring boot AutoConfiguration.replacements 文件的作用
java·spring boot
OPHKVPS12 小时前
Metro4Shell攻击进行中:CVE-2025-11953高危漏洞正被用于入侵React Native开发者机器
安全·web安全
黎阳之光12 小时前
黎阳之光:数智科技破局湖库富营养化,筑造水生态治理新标杆
大数据·人工智能·科技·安全·数字孪生