前言
之前给客户写了个 springboot 服务插件,是运行在 win端的一个程序,由于是 Java8 ,所以使用的是 exe4j 将 jar 打包成 .exe 格式。exe4j 打包教程可自行百度或谷歌,如果是 Java14+ 可以参考我这篇文章:Java打包exe教程 。
后来想到如果直接这样给安装包给到客户的话就直接等于是给了源码(发现程序运行当中jar包会暴露在 %temp% 临时目录中,可以直接拷贝出来进行反编译拿到源码),于是就想到对jar包进行加密处理,这里使用的是 classfinal 进行加密处理,起码能够有效防止反编译破解,增加破解难度。
ClassFinal 加密
这里使用的是maven方式加密
<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>123456</password>
<packages>
com.example.*
</packages>
<cfgfiles>example.yml</cfgfiles>
<libjars>
example.jar
</libjars>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>classFinal</goal>
</goals>
</execution>
</executions>
</plugin>
exe4j打包
加密后不能直接启动jar包,需要使用 java -javaagent:xxx-encrypted.jar='-pwd= 密码' -jar xxx-encrypted.jar 命令启动加密后的jar,固需要在 exe4j 的 VM Parameters 修改 jar 包的启动方式,命令如下:
-javaagent:%EXE4J_TEMPDIR%/service.jar="-pwd 123456" -XX:-DisableAttachMechanism
注意⚠️:为了保证项目在运行时的安全,启动jvm时请加参数: -XX:+DisableAttachMechanism
打包完成后运行 exe ,然后 %temp% 临时目录中的jar 就是加密过的jar了