应用场景就是当需要把公司的产品部署到友方公司或者其他公司时,可以防止客户直接反编译出来源码,大大提升代码的安全性。
版本
- springboot 2.6.8
- jdk8
一、proguard-maven-plugin
第一种方式就是使用代码混淆的方式,可以参考proguard-maven-plugin插件使用,因为配置复杂,用起来太麻烦,本文不做重点介绍。
https://github.com/wvengen/proguard-maven-plugin
二、classfinal-maven-plugin
第二种方式就是使用代码加密的方式,classfinal-maven-plugin方式比较简单,只需要在pom.xml文件中引入一个plugin,然后简单的修改几项配置即可使用。
这种方式不仅可以对代码进行加密,对配置文件application.yml、lib 下的依赖也可以加密。
还可以指定机器运行程序。
https://gitee.com/roseboy/classfinal
三、实战
下面我们实战一下,首先创建一个 SpringBoot 程序,在 pom.xml 中加入。
需要注意的是,该插件需要放到spring-boot-maven-plugin后面
org.springframework.boot
spring-boot-maven-plugin
net.roseboy
classfinal-maven-plugin
1.2.1
#
org.spring
${groupId}
application.yml,application-dev.yml
hutool-all.jar
xxxxx
package
classFinal
上述代码中的机器码可以使用如下工具生成,进去之后点击下载。
https://repo1.maven.org/maven2/net/roseboy/classfinal-fatjar/1.2.1/classfinal-fatjar-1.2.1.jar
然后执行,注意最后参数为大写的C。
java -jar classfinal-fatjar-1.2.1.jar -C
最后将输出的机器码放入到上方的 code 中即可。
执行 Maven 命令打包即可,生成文件如下,其中EncryptDemo-0.0.1-SNAPSHOT-encrypted.jar为生成的加密jar 包。
如需提供给客户,提供该包即可。
使用反编译工具,查看 jar 包中配置文件,可以看到配置文件已经为空。
反编译工具我这里用的是 luyten。
https://github.com/deathmarine/Luyten/releases/tag/v0.5.4_Rebuilt_with_Latest_depenencies
查看代码文件,可以看到方法体被清空,只保留了方法参数、注解等信息。
原理就是启动过程中进行解密,全是内存操作,非常安全。
无密码启动
例如我的 jar 包名称为EncryptDemo-0.0.1-SNAPSHOT-encrypted.jar,那么执行命令如下:
java -javaagent:加密jar包的名称 -jar 加密jar包的名称
java -javaagent:EncryptDemo-0.0.1-SNAPSHOT-encrypted.jar -jar EncryptDemo-0.0.1-SNAPSHOT-encrypted.jar
有密码启动
有密码启动与无密码启动类似,只是启动之后会提示输入密码,按照提示输入密码即可。
如果机器码不匹配,会提示该项目不可在此机器上运行!
正常启动截图如下:
源代码如下:https://github.com/zuiyu-main/EncryptDemo.git
分支:jar-encry
最后介绍一下 ClassFinal ,ClassFinal 能够对class文件进行加密,支持直接加密jar包或者war包,无需修改任务代码,兼容spring framework,可避免源码泄露或者字节码被反编译。
目前看官方介绍支持的功能如下:
- 支持编译好的 jar/war 加密。
- 运行加密项目,无需修改源代码。
- 支持普通jar 包。springboot的jar包,tomcat的war包。
- 支持 spring framework、swagger等在启动过程中扫描注解或者生成字节码的框架。
- 支持maven 插件,添加插件即可自动加密。
- 支持加密lib文件下的依赖。
- 支持绑定机器运行。
- 支持加密 springboot 配置文件。