上文中,我们使用jasypt对项目中application.yml配置文件进行了加密。很多时候我们在将项目打成jar包之后,也是不希望被反编译的,毕竟是我们自己辛苦写的代码。
那怎么办呢?
有现成的轮子供我们使用:classfinal
这是一个开源项目,是的,这是一个开源项目,所以呢,classfinal混淆代码也不是一定不会被反编译的,这里要注意。
Classfinal是使用探针技术对jar包进行加密,简单理解就是类似于aop切面编程,就是在代码运行前后对代码进行操作。很显然,classfinal就是在代码运行前对代码进行解密。那么如果我们看懂了classfinal对代码进行解密的算法。那就是可以对classfinal加密的jar包进行反编译操作的,从而获取到源码的。
如果classfinal加密操作不满足您的要求,可以尝试一下class-winter这个开源项目。
一:在pom文件中添加插件依赖
这部分原本很简单,如果你是一个单模块项目,自然是很简单的。但是呢,我是一个多模块项目。
我是现将插件写入了父项目的pom.xml中,但是在项目打包的时候,报错了。报错原因我这里就不展示了。
那么这个插件该放在哪个项目的pom.xml中呢?
放在入口模块的pom.xml中。
插件代码如下:
<!-- 加密插件 -->
<plugin>
<groupId>net.roseboy</groupId>
<artifactId>classfinal-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<!--加密打包之后pom.xml会被删除,不用担心在jar包里找到此密码,没有密码就是写#-->
<password>#</password>
<!-- 加密代码包 -->
<packages>com</packages>
<!--加密配置文件-->
<cfgfiles>application.yml</cfgfiles>
<!-- 引用的jar 需要加密 -->
<libjars>config-0.0.1-SNAPSHOT.jar,controller-0.0.1-SNAPSHOT.jar,customAnnotations-0.0.1-SNAPSHOT.jar,dao-0.0.1-SNAPSHOT.jar,exception-0.0.1-SNAPSHOT.jar,filter-0.0.1-SNAPSHOT.jar </libjars>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>classFinal</goal>
</goals>
</execution>
</executions>
</plugin>
二:打包
这部分正常打包就可以了。打包完成之后,来到target目录,如下图所示:
多项目模块要是打包报错,你就多试试,一定会成功的。把心放胃里。
三:运行jar包
这部分才是重点。就是如何运行jar包呢?那肯定是不能跟正常没加密之前那样去运行。
加密后的项目需要设置javaagent来启动,项目在启动过程中解密class,完全内存解密,不留下任何解密后的文件。
解密功能已经自动加入到 xxx-encrypted.jar中,所以启动时-javaagent与-jar相同,不需要额外的jar包。
很简单,命令如下:
java -javaagent:entry-0.0.1-SNAPSHOT-encrypted.jar -jar entry-0.0.1-encrypted-SNAPSHOT.jar
对,就是这么简单。
我这里jar包是没有设置密码的,如果你的项目设置了密码,密码为123456,那么上边的命令应该修改为:
java -javaagent:entry-0.0.1-SNAPSHOT-encrypted.jar='pwd 123456' -jar entry-0.0.1-encrypted-SNAPSHOT.jar
就是在参数中配置一下密码就可以了。
以上大概就是使用classfinal对jar包进行加密的大概流程。
最后,还是重点说一下:classfinal的加密并非不可逆,如果对加密要求较高,不建议使用。
有好的建议,请在下方输入你的评论。