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

参考链接


相关推荐
riNt PTIP8 小时前
SpringBoot创建动态定时任务的几种方式
java·spring boot·spring
星晨羽10 小时前
西门子机床opc ua协议实现变量读写及NC文件上传下载
java·spring boot
yuweiade10 小时前
Spring Boot 整合 Redis 步骤详解
spring boot·redis·bootstrap
zmj32032411 小时前
UDS 0x27 安全访问(种子 / 密钥 Seed-Key) 的用法、流程、算法、存储位置、安全机制
安全·can·诊断·uds·27服务
三水不滴11 小时前
SpringAI + SpringDoc + Knife4j 构建企业级智能问卷系统
经验分享·spring boot·笔记·后端·spring
2601_9498146912 小时前
Docker部署Spring Boot + Vue项目
vue.js·spring boot·docker
skywalk816312 小时前
发现Kotti项目的python包Beaker 存在安全漏洞
开发语言·网络·python·安全
团子云技术14 小时前
从 HTTPS 到 LLM Agent:我们重回数字安全的黑暗时代了吗?
安全·ai编程
RDCJM15 小时前
Springboot的jak安装与配置教程
java·spring boot·后端
空中海15 小时前
Redis 专家实战:生产架构设计 × 容量规划 × 安全治理 × 37道高频面试题全解
数据库·redis·安全