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

参考链接


相关推荐
DevSecOps选型指南1 小时前
直击AI全生命周期安全治理,悬镜正式发布原创多模态AIST新品
人工智能·安全·自然语言处理
乾元2 小时前
本地大模型:如何在内网部署 Llama/Qwen 等安全增强模型
运维·网络·人工智能·安全·机器学习·llama·安全架构
星幻元宇VR2 小时前
VR应急救护学习机|让急救教育更直观
学习·安全·vr·虚拟现实
落寞的魚丶2 小时前
第二届全国网络安全行业赛-电子取证师复赛R03(其他赛区)
安全·web安全
计算机学姐2 小时前
基于SpringBoot的宠物诊所管理系统
java·vue.js·spring boot·后端·spring·elementui·宠物
bug攻城狮2 小时前
Spring Boot项目启动时输出PID、CPU和内存信息的4种方法
java·spring boot·后端·logback
星幻元宇VR2 小时前
VR社区安全学习机:居民安全教育新选择
科技·学习·安全·vr·虚拟现实
dashizhi20152 小时前
服务器共享文件安全管理之如何禁止打印共享文件、禁止复制共享文件
运维·服务器·安全
Meta393 小时前
SpringBoot通过kt-connect+kubectl进行本地调试k8s服务
spring boot·后端·kubernetes