【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 密钥泄露和算法篡改是常见的攻击点,而错误的部署配置(如暴露调试端口)则是另一个重要风险面。

参考链接


相关推荐
掉鱼的猫18 小时前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·spring boot
Flynt18 小时前
npm v12 来了:allowScripts 默认关闭,我的项目差点跑不起来
安全·npm·node.js
人活一口气1 天前
Spring Boot与AIGC的完美结合:从零搭建智能内容生成平台
java·spring boot·aigc
java小白小4 天前
SpringBoot(01): 初识SpringBoot,从Spring的痛点说起
spring boot
用户3169353811835 天前
如何从零编写一个 Spring Boot Starter
spring boot
冬奇Lab5 天前
Skill 系列(02):Skill 安全风险——三类攻击面的实战测试
人工智能·安全·开源
程序员晓琪5 天前
约定大于配置:基于 Java 包名自动生成 API 版本路由的最佳实践
java·spring boot·后端
Flittly5 天前
【AgentScope Java新手村系列】(11)中断与恢复
java·spring boot·spring
用户3521802454756 天前
🎆从 Prompt 到 Skill:让 Spring AI Agent 学会"装新技能"
人工智能·spring boot·ai编程
Aphasia3119 天前
VPN 与内网穿透
安全