目录
1. 面对的场景
2. 方案
2.1 使用代码混淆
2.2 JAR包加密
3. 项目操作
4. 启动方式
5. 踩到的各种坑
5.1 java -jar xxx-0.0.1-SNAPSHOT.jar 没有主清单属性
5.2 Caused by: java.lang.IllegalArgumentException: Unrecognized option: -pwd=fxw-jar
1. 面对的场景
最近要将项目部署到其它公司的服务器上,但是呢,又不想要将自己的源码给泄露出去,要求对正式环境的启动包进行安全性的处理,从而防止客户直接通过反编译工具将代码给反编译出来,这里有两个方案。
2. 方案
2.1 使用代码混淆
使用代码混淆工具,如ProGuard、YGuard等,对Java字节码文件进行混淆。这些工具可以通过重命名类、方法、变量等,删除注释和空格,代码优化等操作来达到混淆的效果,增加反编译的难度。
- 使用ProGuard时,需要在项目的
pom.xml
文件中添加相关依赖和插件配置,然后创建一个配置文件(如proguard-rules.pro
),在其中指定需要保留的类或方法,以及需要排除的类或方法。 - 使用YGuard时,同样需要在
pom.xml
中添加插件配置,并创建一个yguard.xml
文件来指定加密规则。
在单模块中使用此方案的话,还算是简单,但是如今的项目基本上都是多模块的,一个模块依赖多个公共的模块,这样的话,使用此方案就得不偿失了,不仅用起来比较麻烦,而且各模块之间的调用在是否混淆时也是极容易出错。
2.2 JAR包加密
今天我们着重来讲解一下使用ClassFinal对JAR文件进行加密。ClassFinal是一款Java class文件安全加密工具,支持直接加密jar包或war包,无需修改任何项目代码,兼容spring-framework,可避免源码泄漏或字节码被反编译。这样实现的效果就是class文件只能看到注解、方法名和参数,方法内容被清空。
3. 项目操作
只需要在启动类的pom.xml文件中添加如下插件即可,但是这里有一个注意点:ClassFinal插件要放在spring-boot-maven-plugin插件的后面,否则不起作用。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.zpark.app.StudentMApplication</mainClass>
<skip>false</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<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>fxw</password> <!--启动密码,#为空-->
<excludes>org.spring</excludes>
<packages>${groupId}</packages> <!--需要加密的包名,有多个使用逗号分隔-->
<cfgfiles>application.properties</cfgfiles> <!--需要加密的配置文件,有多个使用逗号分隔-->
<libjars>hutool-all-5.8.26.jar</libjars> <!--jar包lib目录下要加密的jar依赖,有多个使用逗号分隔-->
<code></code> <!--机器码,指定某个机器启动-->
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>classFinal</goal>
</goals>
</execution>
</executions>
</plugin>
当使用maven工具栏内的install之后,target目录下的xxx-encrypted.jar就是加密之后的jar包了。
4. 启动方式
无密码启动:
java -javaagent:xxxxx-encrypted.jar -jar xxxxx-encrypted.jar
有密码启动:
java -javaagent:xxxxx-encrypted.jar='-pwd 密码' -jar xxxxx-encrypted.jar
一定一定要注意:-pwd之后是空格,并不是“=”号。如果是“=”号的话会出现报错,相关报错在文章末尾给大家总结出来。
5. 踩到的各种坑
5.1 java -jar xxx-0.0.1-SNAPSHOT.jar 没有主清单属性
相信对于习惯了在IDEA等软件内启动项目的同学来说,很少会去在cmd内启动项目。我也一样,但是今天在学习对JAR包加密时,就遇到了这个报错。
首先先来说解决方案:
如果你使用的框架是SpringBoot,你要先确保有这个插件(这个会自动检测主类):
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
然后再观察标签内部如果还有内容的话,<skip>标签内一定要设置为false:
更改之后重写运行命令,成功启动项目:
为什么<skip>true</skip>会导致找不到主清单属性?
在Maven项目中,如果你使用了
<skip>true</skip>
配置在pom.xml
文件中,这通常是用来跳过测试的。当遇到了“找不到主清单属性”的错误,这可能是因为在跳过测试的同时,一些必要的构建步骤(如生成MANIFEST.MF文件中的主类信息)没有被正确执行。因为这个插件是负责将你的项目打包成一个可以执行的JAR文件,其中包含了一个正确的清单文件等内容。
5.2 Caused by: java.lang.IllegalArgumentException: Unrecognized option: -pwd=fxw-jar
这个报错信息的话就是之前提到的-pwd之后得是空格,而不是“=”号,我看了好多网上的资料都是写的 ‘-pwd=密码’,这样的话一运行就会发生如下报错。