警告:以下内容仅用于安全研究与授权测试,未经许可的攻击行为属于违法行为。
一、JWT 身份鉴权:原理与实战
1.1 JWT 结构与工作流
JWT(JSON Web Token)是一种用于身份验证的开放标准,它将用户信息编码为 JSON 对象,并通过数字签名保证其真实性和完整性。
JWT 三部分组成:
- Header(头部):描述签名算法(如 HS256)和令牌类型。
- Payload(负载):包含需要传递的用户数据(如 userid、username),这些信息是 Base64 编码的,并非加密。
- Signature(签名):使用服务器密钥对 Header 和 Payload 进行签名,用于验证令牌的完整性和来源。
典型工作流:
- 用户通过用户名/密码登录。
- 服务器验证凭据后,使用密钥生成 JWT 并返回给客户端。
- 客户端在后续请求的
Authorization头中携带 JWT。 - 服务器验证 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 容器,开箱即用。
打包与运行:
-
打包 :使用 Maven 命令
mvn clean package,在target目录生成xxx.jar。 -
运行 :直接使用 JDK 运行:
bashjava -jar xxx.jar或后台运行:
bashnohup java -jar xxx.jar > log.out 2>&1 &
2.2 WAR 包部署
当需要部署到独立的 Tomcat 服务器时,需将项目打包成 WAR 文件。
配置步骤:
-
修改
pom.xml:xml<packaging>war</packaging> <!-- 排除内置 Tomcat --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> -
改造启动类 :继承
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); } } -
部署 :
- 使用
mvn clean package生成xxx.war。 - 将 WAR 文件放入 Tomcat 的
webapps目录。 - 启动 Tomcat,服务器会自动解压并部署应用。
- 使用
2.3 源码安全
JavaEE 项目部署的是编译后的字节码(.class 文件),而非源码。即使字节码文件泄露,攻击者也需要通过反编译才能获取近似的源码,增加了攻击成本。
三、总结与实战要点
- JWT 是无状态认证的利器,但密钥管理和 Payload 内容是安全的核心。
- JAR 包 部署简单、易于容器化,是微服务架构的首选。
- WAR 包 适用于需要与传统 Tomcat 集群集成的场景。
- 在渗透测试中,JWT 密钥泄露和算法篡改是常见的攻击点,而错误的部署配置(如暴露调试端口)则是另一个重要风险面。
参考链接:
- JWT 安全问题深度分析:https://auth0.com/blog/a-look-at-the-latest-draft-for-jwt-bcp/
- Spring Boot 打包排错:https://blog.csdn.net/Mrzhuangr/article/details/124731024