Allatori混淆SpringBoot项目代码

Allatori简介

Allatori是一个Java 混淆器,它属于第二代混淆器,因此它能够全方位的保护你的知识产权。 Allatori具有以下几种保护方式:命名混淆,流混淆,调试信息混淆,字符串混淆,以及水印技术。对于教育和非商业项目来说这个混淆器是免费的。支持war和jar文件格式,并且允许对需要混淆代码的应用程序添加有效日期。 有项目需要对代码进行保护,比较初级的方案就是对代码进行混淆,打包之后的文件进行反编译后,就可以看到效果。
Allatori官方文档

springBoot中使用Allatori

  • 项目环境
    本项目为基于springBoot搭建的父子结构项目
  • 目标
    对项目中的后台核心代码(java)尽可能地进行混淆,保护源代码,且不能影响服务的正常运行及使用
  • 需解决问题
  1. 因为项目是web项目,少不了的会有对象注入、方法调用、参数映射等。而混淆时会对类名、方法名、参数名等进行重命名,重命名后会影响对象在Spring容器中的注册、方法调用和参数映射的异常;
  2. 项目是父子结构,因此 maven 打包时会将子项目打包为依赖的jar包进行依赖,怎么对依赖的jar进行混淆;
  3. 混淆后的服务如何正常使用,以及错误的排查

使用

在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中的内容并没有被混淆。
  • 解决
  1. boo-admin.jarboo-admin-obfuscated.jar分别解压
  2. boo-admin-obfuscated中的文件(已混淆)覆盖boo-admin中的文件(未混淆)[注意目录对应]
  3. 然后再将boo-admin打包为jar (打包方式参考jar包解压后再打包为jar),此时boo-admin.jar中的代码为混淆后的代码
  4. 类似的方式还可以替换boo-admin中依赖的jar包(子项目依赖)

此时boo-admin.jar 才是最终的经过混淆保护的jar,就可以拿去部署服务啦。

拓展

  • 前端静态文件js、css的压缩
    这里使用的是 YUI Compressor Maven压缩插件
    使用:
    在pom文件中引入这个插件,并进行相关的配置(参考),代码如下:
<!-- YUI Compressor Maven 压缩插件  前端静态资源混淆压缩    start -->
<plugin>
    <!-- YUI Compressor Maven压缩插件 -->
    <groupId>net.alchim31.maven</groupId>
    <artifactId>yuicompressor-maven-plugin</artifactId>
    <version>1.5.1</version>
    <executions>
        <execution>
            <goals>
                <goal>compress</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <!-- 读取js,css文件采用UTF-8编码 -->
        <encoding>UTF-8</encoding>
        <!-- 不显示js可能的错误 -->
        <jswarn>false</jswarn>
        <!-- 是否混淆 -->
        <nomunge>true</nomunge>
        <!-- 若存在已压缩的文件,会先对比源文件是否有改动  有改动便压缩,无改动就不压缩 -->
        <force>false</force>
        <!-- 在指定的列号后插入新行 -->
        <linebreakpos>-1</linebreakpos>
        <!-- 压缩之前先执行聚合文件操作 -->
        <preProcessAggregates>true</preProcessAggregates>
        <!-- 压缩后保存文件后缀 无后缀 -->
        <nosuffix>true</nosuffix>
        <!-- 源目录,即需压缩的根目录 -->
        <sourceDirectory>src/main/resources</sourceDirectory>
        <!-- 输出目录,即压缩后的目录-->
        <outputDirectory>target/classes</outputDirectory>
        <force>true</force>
        <!-- 压缩js和css文件 -->
        <includes>
            <include>**/*.js</include>
            <include>**/*.css</include>
        </includes>
        <!-- 以下目录和文件不会被压缩 -->
        <excludes>
            <exclude>**/*.min.js</exclude>
            <exclude>**/*.min.css</exclude>
        </excludes>
    </configuration>
</plugin>
<!-- YUI Compressor Maven 压缩插件  前端静态资源混淆压缩    end -->

之后再进行maven + package打包
出现类似下面的打印就说明静态文件已经被压缩了
在这里插入图片描述
参考博客

在这里插入图片描述
以上内容也是自己最近学习的结果,在此只给各位大佬一些参考,重在学习交流;
若有什么不对的地方还请欢迎指正
若有什么疑问或者想法,咱们评论区见

猜你喜欢

转载自blog.csdn.net/HELLOMRP/article/details/115012100