我们在工程应用中经常会遇到核心代码不希望给别人抄袭,但系统是用java开发的,无法避免被反编译的情况,这样可以用代码混淆的方式来解决。调查了一下主流的第三方混淆工具,目前主流的有三种技术yguard、ProGuard、Allatori,我们目前方案就是采用Allatori进行Java的代码混淆。
allatori官方网站:https://allatori.com/
proguard官网: https://www.guardsquare.com/proguard.
(以auth-serivce服务为例)

<config>
<input>
<jar in="../app/lib/service-deadline-control-sca-boot-starter-1.5.1-SNAPSHOT.jar"
out="../app/lib/service-deadline-control-sca-boot-starter-1.5.1-SNAPSHOT.jar"/>
input>
<classpath>
<jar name="../app/lib/*.jar"/>
classpath>
<keep-names>
<class template="class com.aaa.sca.config.ServiceDeadlineControlConfiguration">class>
<class template="class com.aaa.sca.constant.ServiceDeadlineControlConstants">class>
<class template="class com.aaa.sca.model.*">class>
<class template="class com.aaa.sca.runner.AuthCodeApplicationRunner">class>
<class template="class com.aaa.sca.scheduler.ServiceCertificateReloadScheduler">class>
<class template="class com.aaa.sca.service.ServiceCertificateService">class>
<class template="class com.aaa.sca.util.*">class>
keep-names>
<ignore-classes>
<class template="class com.aaa.sca.config.ServiceDeadlineControlConfiguration">class>
<class template="class com.aaa.sca.model.AuthCodeContent">class>
<class template="class com.aaa.sca.model.ServiceCertificate">class>
<class template="class *springframework*"/>
<class template="class *spring*"/>
<class template="class *framework*"/>
<class template="class *alibaba*"/>
<class template="class *persistence*"/>
<class template="class *apache*"/>
ignore-classes>
<property name="log-file" value="../allatori/log.xml"/>
<property name="classes-naming" value="abc"/>
<property name="classes-naming" value="unique"/>
<property name="fields-naming" value="123"/>
<property name="fields-naming" value="iii"/>
<property name="string-encryption" value="enable"/>
<property name="string-encryption-type" value="fast"/>
<property name="string-encryption-version" value="v4"/>
config>
在项目的pom.xml新增pulgin依赖
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-resources-pluginartifactId>
<executions>
<execution>
<id>copy-and-filter-allatori-configid>
<phase>packagephase>
<goals>
<goal>copy-resourcesgoal>
goals>
<configuration>
<outputDirectory>${basedir}/targetoutputDirectory>
<resources>
<resource>
<directory>allatoridirectory>
<includes>
<include>allatori.xmlinclude>
includes>
<filtering>truefiltering>
resource>
resources>
configuration>
execution>
executions>
plugin>
<plugin>
<groupId>org.codehaus.mojogroupId>
<artifactId>exec-maven-pluginartifactId>
<version>1.2.1version>
<executions>
<execution>
<id>run-allatoriid>
<phase>packagephase>
<goals>
<goal>execgoal>
goals>
execution>
executions>
<configuration>
<executable>javaexecutable>
<arguments>
<argument>-Xms128margument>
<argument>-Xmx512margument>
<argument>-jarargument>
<argument>allatori/lib/allatori.jarargument>
<argument>${basedir}/target/allatori.xmlargument>
arguments>
configuration>
plugin>
allatori.xml为allatori插件的混淆配置
in是未混淆的jar的输入路径, out是混淆后的jar输出路径
classpath是jar依赖的相关jar
class 指定保持不变的类名,配置类保持,不然springboot加载会有问题
field 指定保持不变的属性名
method 指定保持不变的方法名
ignore-classes是指定完全不混淆的class
mvn clean install -Dmaven.test.skip=true

使用jd-gui工具反编译jar包,查看代码,看到以下效果就是混淆成功了;

启动项目是否正常,查看日志是否正常,各方面政策则完成混淆可以直接推代码到测试环境运行;
参考博客:
https://blog.csdn.net/lonelymanontheway/article/details/104574050/
https://blog.csdn.net/blackoon88/article/details/124630907