Allatori简介
Allatori是一个Java 混淆器,它属于第二代混淆器,因此它能够全方位的保护你的知识产权。 Allatori具有以下几种保护方式:命名混淆,流混淆,调试信息混淆,字符串混淆,以及水印技术。对于教育和非商业项目来说这个混淆器是免费的。支持war和jar文件格式,并且允许对需要混淆代码的应用程序添加有效日期。 有项目需要对代码进行保护,比较初级的方案就是对代码进行混淆,打包之后的文件进行反编译后,就可以看到效果。
Allatori官方文档
springBoot中使用Allatori
- 项目环境
本项目为基于springBoot搭建的父子结构项目 - 目标
对项目中的后台核心代码(java)尽可能地进行混淆,保护源代码,且不能影响服务的正常运行及使用 - 需解决问题
- 因为项目是web项目,少不了的会有对象注入、方法调用、参数映射等。而混淆时会对类名、方法名、参数名等进行重命名,重命名后会影响对象在Spring容器中的注册、方法调用和参数映射的异常;
- 项目是父子结构,因此 maven 打包时会将子项目打包为依赖的jar包进行依赖,怎么对依赖的jar进行混淆;
- 混淆后的服务如何正常使用,以及错误的排查
使用
在pom文件中引入依赖
里边的配置我已经标了详细的注释,注意根据自己的具体环境做调整
<!-- allatori 代码混淆 start -->
<plugin>
<!-- resouces拷贝文件插件 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<!-- 执行这个插件的时候执行申明的所有phase -->
<executions>
<execution>
<id>copy-and-filter-allatori-config</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<!-- 指明文件的输出路径 即混淆后的文件的输出路径 ${basedir}:是项目的根目录 即与src同级的目录 -->
<outputDirectory>${basedir}/target</outputDirectory>
<resources>
<resource>
<!-- 项目的resources目录,一般用于存放配置文件 -->
<directory>src/main/resources</directory>
<includes>
<!-- 代码混淆时所依据的配置文件 可以看出,我放在了resources目录下 这个文件将会被拷贝到 ${basedir}/target 目录下-->
<include>allatori.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<!-- 代码混淆打包插件 -->
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<id>run-allatori</id>
<phase>package</phase>
<goals>
<goal>exec</goal>
</goals>
</execution>
</executions>
<configuration>
<executable>java</executable>
<arguments>
<argument>-Xms128m</argument>
<argument>-Xmx512m</argument>
<argument>-jar</argument>
<!-- 指定引用的allatori的jar包位置,这里把jar包放在了根目录下的lib目录里 -->
<argument>${basedir}/lib/allatori.jar</argument>
<!-- 指定代码混淆时的配置文件,因为是混淆指定的是jar包,jar包位置在target下,所以我们的allatori.xml也需要拷贝到该目录下(上面的拷贝文件插件已经帮我们做了这些事) -->
<argument>${basedir}/target/allatori.xml</argument>
</arguments>
</configuration>
</plugin>
<!-- allatori 代码混淆 end -->
- jar包
从上面可以看出,我们从外部引入了allatori.jar,注意路径为${basedir}/lib/allatori.jar
在项目根目录,也就是与src
同级别的目录下
jar包可以从官网获取,也可以点这里一键获取 - 配置文件
即上面提到的allatori.xml
,下面是配置的详细内容
allatori.xml 配置
<config>
<!-- 指定混淆的jar以及输出 -->
<input>
<!-- boo-admin.jar是要混淆的jar; boo-admin-obfuscated.jar是混淆之后的jar -->
<jar in="../target/boo-admin.jar" out="../target/boo-admin-obfuscated.jar"/>
<!-- 混淆指定的jar 可以多个 注意路径 这样就可以混淆依赖的jar了(子项目)-->
<jar in="../../boo-system/target/boo-system-4.3.1.jar"
out="../../boo-system/target/boo-system-4.3.1-boo.jar"/>
<!--<dir in="in-dir" out="out-dir"/> 混淆文件夹下的所有jar -->
</input>
<!-- 保持名称不被替换 -->
<keep-names>
<!-- 所有方法名称不变 parameters="keep" 表示方法的形参也不变 方法形参混淆后会导致参数映射获取失败 -->
<!--<method template="*(**)" parameters="keep" />-->
<!-- 控制层 方法名、方法、形参 不混淆 -->
<class template="class com.boo.*.controller.*">
<method template="protected+ *(**)" parameters="keep"/>
</class>
<!-- 配置 访问修饰符为protected及以上的访问级别的类名 以及 类中的方法名、参数名不被混淆 -->
<class access="protected+">
<field access="protected+"/>
<method access="protected+"/>
</class>
</keep-names>
<!--<property name="log-file" value="../target/log.xml"/>-->
<!-- 排除指定的类 不混淆 -->
<ignore-classes>
<!-- 配置启动类不被混淆 保证springBoot可以正常启动 -->
<class template="class *Application*" />
<!-- 第三方的 不需要混淆 -->
<class template="class *springframework*"/>
<class template="class *shardingjdbc*"/>
<class template="class *jni*"/>
<class template="class *alibaba*"/>
<class template="class *persistence*"/>
<class template="class *apache*"/>
<class template="class *mybatis*"/>
<!-- 排除如下包下的类-->
<!--<class template="class com.boo.*.mapper.*" /> -->
<class template="class com.boo.*.domain.*" /> <!-- 实体类存在映射关系 混淆后会映射不上 -->
</ignore-classes>
<watermark key="secure-key-to-extract-watermark" value="Customer: boo"/> <!-- 水印 -->
</config>
上面是一些基础而且常用的配置,其他还有很多功能的配置,根据自己的项目做调整;你也可以参考Allatori官方文档,最终还是以官方文档为准
打包
maven打包命令mvn clean package
看到如下打印即说明混淆成功了
target目录下内容
混淆前后的代码内容大概就是这样婶儿的(举个柿子):
-
问题
因为是父子项目,混淆后的jar并不能直接运行,因为它只是一个子项目的打包结果,真正最终的jar为boo-admin.jar
(可运行),但是boo-admin.jar
中的内容并没有被混淆。 - 解决:
- 将
boo-admin.jar
与boo-admin-obfuscated.jar
分别解压 - 用
boo-admin-obfuscated
中的文件(已混淆)覆盖boo-admin
中的文件(未混淆)[注意目录对应] - 然后再将
boo-admin
打包为jar (打包方式参考jar包解压后再打包为jar
),此时boo-admin.jar
中的代码为混淆后的代码 - 类似的方式还可以替换
boo-admin
中依赖的jar包(子项目依赖)
此时boo-admin.jar
才是最终的经过混淆保护的jar,就可以拿去部署服务啦。
以上内容也是自己最近学习的结果,在此只给各位大佬一些参考,重在学习交流;
若有什么不对的地方还请欢迎指正
若有什么疑问或者想法,咱们评论区见