使用classfinal-maven-plugin加密 Spring Boot JAR 包配置流程

前言

如果项目要求部署到其他公司的服务器上,但是又不想将源码泄露出去。要求对正式环境的启动包进行安全性处理,防止客户直接通过反编译工具将代码反编译出来。

方案解决:

第一种方案使用代码混淆

采用 proguard-maven-plugin 插件

在单模块中此方案还算简单,但是现在项目一般都是多模块,一个模块依赖多个公共模块。那么使用此方案就比较麻烦,配置复杂,文档难懂,各模块之间的调用在是否混淆时极其容易出错。
第二种方案使用代码加密

采用classfinal-maven-plugin插件

此方案比对上面的方案来说,就简单了许多。直接配置一个插件就可以实现源码的安全性保护。并且可以对yml、properties配置文件以及lib目录下的maven依赖进行加密处理。若想指定机器启动,支持绑定机器,项目加密后只能在特定机器运行。

ClassFinal 项目源码地址:https://gitee.com/roseboy/classfinal

这里介绍的是第二种方案

第一步:在 pom.xml 中添加插件配置
java 复制代码
在 <build><plugins> 节点下添加以下配置(无需修改项目源代码)
<plugin>
<!--
  1. 加密后,方法体被清空,保留方法参数、注解等信息.主要兼容swagger文档注解扫描
  2. 方法体被清空后,反编译只能看到方法名和注解,看不到方法体的具体内容
  3. 加密后的项目需要设置javaagent来启动,启动过程中解密class,完全内存解密,不留下任何解密后的文件
  4. 启动加密后的jar,生成xxx-encrypted.jar,这个就是加密后的jar文件,加密后不可直接执行
  5. 无密码启动方式,java -javaagent:xxx-encrypted.jar -jar xxx-encrypted.jar
  6. 有密码启动方式,java -javaagent:xxx-encrypted.jar='-pwd= 密码' -jar xxx-encrypted.jar
-->
    <groupId>net.roseboy</groupId>
    <artifactId>classfinal-maven-plugin</artifactId>
    <version>1.2.1</version>
    <configuration>
        <!-- 加密密码,# 表示无密码模式 -->
        <password>#</password>
        
        <!-- 需要加密的包名(多个用逗号分隔) -->
        <packages>com.yourcompany.yourproject</packages>
        
        <!-- 需要加密的配置文件(支持通配符) -->
        <cfgfiles>application.yml,application-*.yml</cfgfiles>
        
        <!-- 需要加密的依赖 jar(如:lib/fastjson-1.2.83.jar) -->
        <libjars></libjars>
        
        <!-- 机器绑定码(留空则不绑定机器) -->
        <code></code>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>classFinal</goal>
            </goals>
        </execution>
    </executions>
</plugin>

关键参数说明:

  • <password>:启动密码,# 表示无密码模式;若设密码,启动时需通过 -pwd 参数提供

  • <packages>:指定要加密的包路径(如 com.yourcompany),空值会加密所有类

  • <cfgfiles>:加密配置文件内容,反编译后显示为空文件

  • <libjars>:加密 BOOT-INF/lib 下的特定依赖 jar 包

  • <code>:机器码,实现"一机一码"绑定

第二步:执行 Maven 打包

mvn clean package

执行过程 :Maven 会先编译项目,然后在 package 阶段自动触发 classfinal 加密,最终在 target/ 目录生成两个文件:

  • your-project-1.0.jar:原始未加密包(可删除)

  • your-project-1.0-encrypted.jar:加密后的部署包

第三步:生成机器码

如需绑定到特定服务器,先获取机器码:

  1. 下载 classfinal-fatjar-1.2.1.jar 工具

  2. 在目标服务器上执行:

    java -jar classfinal-fatjar-1.2.1.jar -C

  3. 将生成的机器码填入 pom.xml 的 <code> 标签中,重新打包

第四步:部署与启动

加密后的 JAR 包不能直接运行 ,必须使用 -javaagent 参数启动:

无密码模式:

java -javaagent:your-project-1.0-encrypted.jar -jar your-project-1.0-encrypted.jar

有密码模式 (假设密码为 123456):

java -javaagent:your-project-1.0-encrypted.jar='-pwd 123456' -jar your-project-1.0-encrypted.jar

第五步:验证加密效果

使用 JD-GUI 或其他反编译工具打开加密后的 JAR 包,预期结果:

  1. 配置文件 (如 application.yml)内容为空

  2. class 文件的方法体被清空,仅保留方法签名和注解

  3. 依赖 jar 同样被加密,无法查看源码

相关推荐
白露与泡影8 小时前
Spring Boot 实现验证码:Hutool-captcha、AJ-Captcha、EasyCaptcha 到底怎么选?
java·spring boot·后端
seconp8 小时前
基于Spring Boot和Vue 3的智慧旅游网站:住宿预订、行程规划与千问接入
vue.js·spring boot·毕业设计·软件工程·课程设计·旅游·毕设
vx_bisheyuange8 小时前
基于SpringBoot的校园数字化图书馆系统
spring boot·毕业设计
小蒜学长8 小时前
基于Springboot+Vue的高校教师教学业绩综合管理系统的设计与开发(代码+数据库+LW)
java·数据库·spring boot·后端·教学业绩管理·三级权限
Mikko78 小时前
Spring Boot 3.5.16 自带的 Tomcat 10.1.55 中了哪些 CVE?其中一条是修上一个漏洞时带进来的
java·spring boot·后端·安全·tomcat
十年Java程序媛8 小时前
Java 内部类全解|成员 / 静态 / 匿名内部类,理清和 Lambda 的区别
java·spring boot·面试
SL_staff8 小时前
报工≠打卡:从任务报工到闭环管控的5个数据断点排查清单
java·spring boot·全栈
开开心心就好9 小时前
手机电池健康怎么查?看容量温度循环次数
spring·智能手机·ffmpeg·计算机外设·电脑·maven·音视频
知守观9 小时前
mirrorOf= 把私服请求拦去了公网镜像:本地能跑,CI 上内部包 404 排查
后端·ci/cd·maven
ly76899 小时前
读懂 PostgreSQL 执行计划:从 EXPLAIN 输出定位 Spring Boot 慢 SQL 的代价估算偏差
spring boot·sql·postgresql·执行计划·explain analyze·慢sql优化