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;

相关推荐
壹方秘境3 小时前
95后中间件研发,放弃高薪裸辞,两年时间做了ChatTCP和ApiCatcher两款网络分析和抓包工具
后端·产品·创业
极创信息3 小时前
企业信创产品认证全流程:从信创适配到信创认证的实操指南(2026版)
java·数据库·spring boot·mysql·matlab·mybatis·软件工程
重庆小透明3 小时前
【java基础内容】ArrayList与LinkedList的区别及ArrayList源码解析
java·开发语言·后端·面试·职场和发展
一只叫煤球的猫3 小时前
芋道源码,拉黑我,改变不了你还在搬运别人文章的事实
java·后端·面试
不光头强3 小时前
restful编码风格
后端·restful
tsyjjOvO3 小时前
Redis 从入门到集群搭建(续)
redis·后端·缓存
givemeacar3 小时前
十七:Spring Boot依赖 (2)-- spring-boot-starter-web 依赖详解
前端·spring boot·后端
掘金者阿豪4 小时前
从 Chat Completions 到 Responses:一文彻底搞懂 OpenAI 新一代统一接口设计
后端