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

参考链接


相关推荐
技术不好的崎鸣同学11 分钟前
WEB安全之XSS专题:前沿案例与实战分析
安全·web安全·xss
淼淼爱喝水34 分钟前
DVWA和Pikachu命令注入漏洞检测实验
安全·web安全·php·pikachu·dvwa
一 乐37 分钟前
学院教学工作量统计|基于java+ vue学院教学工作量统计管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·学院教学工作量统计系统
应用市场38 分钟前
Android Verified Boot 2.0 安全启动原理详解
android·安全
jixunwulian1 小时前
AI边缘智能网关工业安全领域的边缘智能预警方案应用
网络·人工智能·安全
静小谢1 小时前
sql笔记
spring boot·笔记·sql·mybatis
TechWayfarer1 小时前
网络安全视角:利用IP定位API接口识别机房与基站流量(合规风控篇)
开发语言·网络·数据库·python·安全·网络安全
SL-staff1 小时前
企业文档私有化部署的安全设计:加密存储、传输与审计日志
安全·私有化部署·数据安全·加密·安全架构·合规·企业文档
逍遥德2 小时前
常见的任务调度框架介绍
java·spring boot·中间件
念越2 小时前
HTTPS 安全内核:对称与非对称加密的博弈,数字证书一战定局
java·网络·网络协议·安全·https