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

1. 背景

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

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

2. ClassFinal 简介

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

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

  • 配置文件加密 :对 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;

相关推荐
阳光是sunny8 小时前
LangGraph中的Reducer是什么
前端·人工智能·后端
灯澜忆梦8 小时前
GO_并发编程---定时器
开发语言·后端·golang
阳光是sunny8 小时前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
鱟鲥鳚8 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
皮皮林5519 小时前
开源实力派,给本地 AI 装上深度调研能力,一张 3090 跑到 95.7 分!
后端
努力的小雨9 小时前
把 Windows 桌面图标做成一个会自己运转的小世界
后端
武子康10 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端
腾渊信息科技公司10 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
IT_陈寒12 小时前
Vue这个特性差点让我加班到凌晨,谁懂啊
前端·人工智能·后端
段一凡-华北理工大学12 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化