一.使用场景
在实际开发中,有时候我们可能需要对 SpringBoot 项目的 Jar 包进行加密,以防止他人对代码的反编译和恶意使用。以下是一些常见的使用场景:
1.商业应用保护:如果你的 SpringBoot 项目是一个商业应用,你可能希望将核心代码进行加密,以避免竞争对手或黑客窃取关键业务逻辑和算法。
2.安全性要求高的应用:某些应用程序可能处理敏感数据,如金融、医疗或政府数据等。在这种情况下,加密 Jar 包可以提供额外的安全层,确保数据和代码的机密性。
3.防止反编译:通过加密 Jar 包,你可以大幅降低他人对代码的理解和修改难度,从而减少源代码泄漏的风险,并阻碍恶意用户进行反编译、篡改和滥用代码。
4.保护知识产权:对于一些重要的知识产权,如算法、模型等,加密 Jar 包可以有效地防止他人窃取和复制这些知识产权,保护你的技术优势和商业利益。
二.加密方案
采用 ClassFinal。
ClassFinal 是一款 java class 文件安全加密工具,支持直接加密 Jar 包或 War 包,无需修改任何项目代码,兼容 spring-framework,可避免源码泄漏或字节码被反编译,并且可以对 yml、properties 配置文件以及 lib 目录下的 maven 依赖进行加密处理。支持绑定机器,项目加密后只能在特定机器运行。
三.配置使用
只需要在项目的 pom.xml 文件中增加如下插件即可,需要注意的是,该插件时要放到 spring-boot-maven-plugin 插件后面,否则不起作用。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<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>
<excludes>org.spring</excludes>
<!-- 加密的包名,多个包用逗号分开 -->
<packages>${project.groupId}</packages>
<!-- 加密的配置文件,多个包用逗号分开 -->
<cfgfiles>application.yml,application-dev.yml,application-prod.yml</cfgfiles>
<!-- jar包lib下面要加密的jar依赖文件,多个包用逗号分开 -->
<libjars>hutool-all.jar</libjars>
<!-- 指定机器启动,机器码 -->
<code>xxxx</code>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>classFinal</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
四.启动方式
1.无密码启动
java -javaagent:xxx-encrypted.jar -jar xxx-encrypted.jar
2.有密码启动
java -javaagent:xxx-encrypted.jar='-pwd=密码' -jar xxx-encrypted.jar
3.绑定机器启动
下载 classfinal-fatjar-1.2.1.jar 包,在下载的包所在路径下 cmd 执行 java -jar classfinal-fatjar-1.2.1.jar -C 命令,会自动生成一串机器码:
将此生成好的机器码,放到 maven 插件中的 code 里面即可。这样,打包好的项目只能在生成机器码的机器运行,其他机器则启动不了项目。
五.反编译效果
启动包加密之后,方法体被清空,保留方法参数、注解等信息。主要兼容 swagger 文档注解扫描,反编译只能看到方法名和注解,看不到方法体的具体内容。启动过程中解密 class,完全内存解密,不留下任何解密后的文件。
评论