Spring Boot JAR包加密防反编译:ClassFinal 实战指南

1. 背景

在交付 Spring Boot 项目时,JAR 包很容易被反编译工具(如 JD-GUI、FernFlower)直接打开,业务代码、配置文件中的数据库密码、云密钥等敏感信息将暴露无遗。为了提升代码被逆向分析的难度,我们需要对 JAR 包进行加密。

本文介绍一款简单易用的开源工具 ------ ClassFinal,它通过 Java Agent 机制在类加载时解密,可清空方法体或整体加密,同时支持配置文件保护。我们将以一个真实的多模块 Spring Boot 项目为例,完整演示集成、打包、运行的全过程,并解决常见坑点。

2. ClassFinal 简介

ClassFinal 是一个 Java 字节码加密工具,支持:

  • 方法体清空 :保留类结构和方法签名,但方法内代码被替换为 return 或 throw,反编译后看不到任何业务逻辑。

  • 配置文件加密 :对 application.yml 等配置文件内容进行加密,运行时自动解密。

  • 机器绑定:可绑定 CPU、主板等硬件信息,防止 JAR 包被复制到其他机器运行。

原理 :在打包阶段修改 Class 文件,并在启动时通过 -javaagent 参数注入解密逻辑,解密发生在内存中,不影响运行性能。

3. 环境准备

  • JDK 1.8+

  • Maven 3.x

  • Spring Boot 2.5.x(其他版本亦可)

4. 集成 ClassFinal 插件

假设你的项目是一个多模块 Maven 工程,最终可执行 JAR 由 job-admin 模块产生。不要 在父 POM 中配置 ClassFinal,否则会因父模块不生成 JAR 而报错 jar/war文件格式有误。

4.1 在 ruoyi-admin/pom.xml 中添加插件

bash 复制代码
<build>
    <plugins>
        <!-- Spring Boot 打包插件(必须放在 ClassFinal 之前) -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <executable>true</executable>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

        <!-- ClassFinal 加密插件 -->
        <plugin>
            <groupId>net.roseboy</groupId>
            <artifactId>classfinal-maven-plugin</artifactId>
            <version>1.2.1</version>
            <configuration>
                <!-- 加密密码,生产环境建议从环境变量读取 -->
                <password>${env.CLASSFINAL_PWD}</password>
                <!-- 需要加密的包名(业务代码根包) -->
                <packages>com.gig.**</packages>
                <!-- 需要加密的配置文件(多个用逗号分隔) -->
                <cfgfiles>application.yml,application-dev.yml,application-prod.yml,application-druid.yml</cfgfiles>
                <!-- 是否开启调试模式 -->
                <debug>false</debug>
                <!-- 是否绑定机器(可选) -->
                <!-- <bind>true</bind> -->
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>classFinal</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

关键点:

  • packages:支持通配符,com.gig.** 会加密该包及其子包下的所有类。

  • cfgfiles:列出所有需要保护的配置文件。必须显式列出,否则文件将保持明文(初学者常犯的错误)。

  • password:建议通过环境变量传入,避免硬编码在 POM 中。

4.2 设置环境变量(或直接写死测试)

在打包前导出密码:

bash 复制代码
# Linux/Mac
export CLASSFINAL_PWD=abcd2026

# Windows (cmd)
set CLASSFINAL_PWD=abcd2026

5. 打包与加密

在项目根目录执行:

bash 复制代码
mvn clean package -pl ruoyi-admin -am

-pl job-admin -am 表示只构建 job-admin 模块及其依赖的模块。打包成功后,在 job-admin/target/ 目录下会生成两个 JAR:

  • ruoyi-admin-3.9.0.jar(原始包,可删除)

  • ruoyi-admin-3.9.0-encrypted.jar(加密后的可运行包)

6. 运行加密后的 JAR

6.1 Windows 环境(CMD)

bash 复制代码
正确的 Windows 命令写法
java "-javaagent:ruoyi-admin-encrypted.jar=-pwd abcd2026" -jar ruoyi-admin-encrypted.jar

6.2 Linux / Mac 环境

bash 复制代码
Linux 命令写法

java -javaagent:ruoyi-admin-encrypted.jar='-pwd abcd2026' -jar ruoyi-admin-encrypted.jar 

java -javaagent:ruoyi-admin-encrypted.jar="-pwd abcd2026" -jar ruoyi-admin-encrypted.jar

nohup java -javaagent:ruoyi-admin-encrypted.jar='-pwd abcd2026' -jar ruoyi-admin-encrypted.jar > app.log 2>&1 &

6.4 验证加密效果

用解压工具打开加密后的 JAR,查看 BOOT-INF/classes/ 下的配置文件:

bash 复制代码
application.yml -> classfinal:U2FsdGVkX18Kj7vZ...

再反编译一个业务 Controller,方法体内只剩 return null;。

相关推荐
光依旧17 小时前
MCP实战手记系列(十):MCP Server高可用实战
spring boot·高可用·nginx负载均衡·redis哨兵·mcp·微服务容错·resilience4j熔断
刚子编程19 小时前
我用 ASP.NET Core 做了个水稻病虫害检查系统
后端·asp.net
谢亮_vipxieliang19 小时前
用 PHP 构建轻量级 REST API:从路由到鉴权的完整实践
开发语言·后端·php
省钱兄--zs20 小时前
西安24小时自助健身房解决方案实战:系统开发与部署全流程指南
java·spring boot·系统架构·intellij-idea·需求分析
码事漫谈1 天前
三步改掉 AI 味,附可直接复制的去 AI 味提示词
后端
IT_陈寒1 天前
Redis卡顿的锅,这次真不是大key的错
前端·人工智能·后端
可乐鸡翅yeah_1 天前
video.js 集成 hls.js 开发 M3U8 播放器,新手高频踩坑
开发语言·前端·javascript·后端·ecmascript·m3u8·音视频在线播放
ly76891 天前
Spring Boot 集成 Elasticsearch 的生产实践:客户端选型、索引生命周期与批量写入容错
spring boot·elasticsearch·索引生命周期·java api client·批量写入
程序猿_极客1 天前
【免费】分享一套优质的基于SpringBoot的服装商城管理系统的设计与实现(带可视化图表、协同过滤功能),源码+文档+视频详解(讲解)
java·spring boot·后端·服装商城管理系统