ClassFinal
介绍
ClassFinal是一款java class文件安全加密工具,支持直接加密jar包或war包,无需修改任何项目代码,兼容spring-framework;可避免源码泄漏或字节码被反编译。
github:https://github.com/roseboy/classfinal
gitee:https://gitee.com/roseboy/classfinal
功能特性
- 无需修改原项目代码,只要把编译好的jar/war包用本工具加密即可。
- 运行加密项目时,无需求修改tomcat,spring等源代码。
- 支持普通jar包、springboot jar包以及普通java web项目编译的war包。
- 支持spring framework、swagger等需要在启动过程中扫描注解或生成字节码的框架。
- 支持maven插件,添加插件后在打包过程中自动加密。
- 支持加密WEB-INF/lib或BOOT-INF/lib下的依赖jar包。
- 支持绑定机器,项目加密后只能在特定机器运行。
- 支持加密springboot的配置文件。
命令行加密
下载 classfinal-fatjar-1.2.1.jar
加密
将打包的 jar 包与classfinal-fatjar-1.2.1.jar 置于同一目录下,运行命令行:
java -jar classfinal-fatjar.jar -C
得到机器码:
16:49:56 with qianyan in phd/0_project/jar via ☕ v1.8.0_282 via 🅒 base
➜ java -jar classfinal-fatjar-1.2.1.jar -C
=========================================================
= =
= Java Class Encryption Tool v1.2.1 by Mr.K =
= =
=========================================================
Server code is: 1B10226F9320E9E3E717D451F72D718FF0346C10480D2A82296ABDB7E4EA0765A4DEE6CC49F46F6DD442915CB1A52E0F
==>/Users/qianyan/phd/0_project/jar/classfinal-code.txt
使用如下命令行对 jar 包进行加密:
java -jar classfinal-fatjar-1.2.1.jar -file app-ops-user.jar -packages com.app.ops.user -cfgfiles bootstrap.yml -pwd neuNEU210 -code 1B10226F9320E9E3E717D451F72D718FF0346C10480D2A82296ABDB7E4EA0765A4DEE6CC49F46F6DD442915CB1A52E0F
参数说明:
参数说明
-file 加密的jar/war完整路径
-packages 加密的包名(可为空,多个用","分割)
-libjars jar/war包lib下要加密jar文件名(可为空,多个用","分割)
-cfgfiles 需要加密的配置文件,一般是classes目录下的yml或properties文件(可为空,多个用","分割)
-exclude 排除的类名(可为空,多个用","分割)
-classpath 外部依赖的jar目录,例如/tomcat/lib(可为空,多个用","分割)
-pwd 加密密码,如果是#号,则使用无密码模式加密
-code 机器码,在绑定的机器生成,加密后只可在此机器上运行
-Y 无需确认,不加此参数会提示确认以上信息
在同目录下得到:app-ops-user-encrypted.jar
,加密后的 jar 文件;加密后的文件不可直接执行,需要配置 javaagent
。
启动加密后 jar 包
加密后的项目需要设置 javaagent 来启动,项目在启动过程中解密 class,完全内存解密,不留下任何解密后的文件。解密功能已经自动加入到 yourpaoject-encrypted.jar 中,所以启动时-javaagent与-jar相同,不需要额外的jar包。
启动 jar 项目执行以下命令:
java -javaagent:app-ops-user-encrypted.jar='-pwd neuNEU210' -jar app-ops-user.jar
若命令行中不配置密码,启动后在控制台里输入密码,命令行如下:
java -javaagent:app-ops-user-encrypted.jar -jar app-ops-user-encrypted.jar
若绑定机器码后在其他机器上运行,得到如下结果:
maven
在要加密的项目 pom.xml 中加入以下插件配置:
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<!-- 生成spring boot jar包使用 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>net.roseboy</groupId>
<artifactId>classfinal-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<password>neuNEU210</password><!--加密打包之后pom.xml会被删除,不用担心在jar包里找到此密码-->
<packages>com.app.ops.*,mapper</packages>
<libjars>*.jar</libjars>
<cfgfiles>*.yml</cfgfiles>
<code>1B10226F9320E9E3E717D451F72D718FF0346C10480D2A82296ABDB7E4EA0765A4DEE6CC49F46F6DD442915CB1A52E0F</code>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>classFinal</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
使用 mvn package
后得到 加密后的 jar 包 app-ops-user-encrypted.jar
。
测试
正常 springboot 项目的class文件在 \BOOT-INF\classes\
路径下,在这个路径下查看业务代码,通过反编译工具可以看到,ClassFinal加密完代码后,原始的class文件并不会完全被加密,只是方法体被清空,保留方法参数、注解等信息,这是为了兼容 spring,swagger 等扫描注解的框架;方法体被清空后,反编译者只能看到方法名和注解,看不到方法的具体内容:
评论区