关于allatori代码混淆技术的一次实践

1. Java代码混淆的背景

1.1 混淆使用场景

我们在工程应用中经常会遇到核心代码不希望给别人抄袭,但系统是用java开发的,无法避免被反编译的情况,这样可以用代码混淆的方式来解决。调查了一下主流的第三方混淆工具,目前主流的有三种技术yguard、ProGuard、Allatori,我们目前方案就是采用Allatori进行Java的代码混淆。

1.2 Allatori简介

allatori官方网站:https://allatori.com/
proguard官网: https://www.guardsquare.com/proguard.

2. 混淆的插件的集成

2.1 操作流程

(以auth-serivce服务为例)

  1. 在auth-service服务下建立allatori文件夹
  2. 将官网下载的lib文件夹拷贝到allatori文件夹下

在这里插入图片描述

  1. 新建allatori.xml文件(log.xml文件在package的时候会自动生成)
<config>
    <input>
        <!--混淆后直接覆盖原文件,out指向的路劲为混淆后的jar -->
        <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 access="protected+">-->
<!--            <field access="protected+" />-->
<!--            <method access="protected+" />-->
<!--        </class>-->

        <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>


        <!-- Matches serialization members -->
<!--        <class template="class * instanceof java.io.Serializable">-->
<!--            <field template="static final long serialVersionUID"/>-->
<!--            <method template="void writeObject(java.io.ObjectOutputStream)"/>-->
<!--            <method template="void readObject(java.io.ObjectInputStream)"/>-->
<!--            <method template="java.lang.Object writeReplace()"/>-->
<!--            <method template="java.lang.Object readResolve()"/>-->
<!--        </class>-->
    </keep-names>

    <ignore-classes>
        <!-- 配置启动类不被混淆  保证springBoot可以正常启动 -->
<!--        <class template="class *ServiceDeadlineControlConfiguration*"/>-->
        <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*"/>
        <!-- 排除如下包下的类-->
<!--        <class template="class com.sinohealth.sca.config.*"/>-->
    </ignore-classes>

    <property name="log-file" value="../allatori/log.xml"/>
<!--    <property name="packages-naming" value="abc"/>-->
    <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>
  1. 在项目的pom.xml新增pulgin依赖

    				<plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-resources-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>copy-and-filter-allatori-config</id>
                            <phase>package</phase>
                            <goals>
                                <goal>copy-resources</goal>
                            </goals>
                            <configuration>
                                <outputDirectory>${basedir}/target</outputDirectory>
                                <resources>
                                    <resource>
                                        <directory>allatori</directory>
                                        <includes>
                                            <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.2.1</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>
                            <argument>allatori/lib/allatori.jar</argument>
                            <argument>${basedir}/target/allatori.xml</argument>
                        </arguments>
                    </configuration>
                </plugin>
    

2.2 混淆的配置说明

allatori.xml为allatori插件的混淆配置

 		<input>
        <!--混淆后直接覆盖原文件,out指向的路劲为混淆后的jar -->
        <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>

in是未混淆的jar的输入路径, out是混淆后的jar输出路径

		<classpath>
        <jar name="../app/lib/*.jar"/>
    </classpath>

classpath是jar依赖的相关jar

    <keep-names>
            <class access="protected+">
                <field access="protected+" />
                <method access="protected+" /> 
            </class>
            <class template="class com.aaaa.sca.config.ServiceDeadlineControlConfiguration"></class>
    </keep-names>

class 指定保持不变的类名,配置类保持,不然springboot加载会有问题

field 指定保持不变的属性名

method 指定保持不变的方法名

  <ignore-classes>
        <!-- 配置启动类不被混淆  保证springBoot可以正常启动 -->
<!--        <class template="class *ServiceDeadlineControlConfiguration*"/>-->
        <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>

ignore-classes是指定完全不混淆的class

2.3 校验混淆结果

  1. 执行maven指令,进行打包,如果看到一下日志,说明打包成功;
mvn clean install  -Dmaven.test.skip=true

在这里插入图片描述

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

    在这里插入图片描述

  2. 启动项目是否正常,查看日志是否正常,各方面政策则完成混淆可以直接推代码到测试环境运行;

参考博客:

https://blog.youkuaiyun.com/lonelymanontheway/article/details/104574050/

https://blog.youkuaiyun.com/blackoon88/article/details/124630907

回答: 代码混淆是一种保护项目源码安全性的措施,通过对代码进行混淆,可以防止别人通过反编译项目查看代码。在Spring Boot项目中进行代码混淆时,可能会遇到一些问题。比如,引用中提到ProGuard对于带有前缀的类文件名称识别不了,因此无法混淆。另外,引用中分享了使用Allatori-7.7进行代码混淆的步骤和反编译操作。另外,还可以通过修改Spring的bean命名策略来按类的全限定名来命名,以增加混淆的效果。例如,引用中的代码示例演示了如何修改Spring的bean命名策略。总之,要在Spring Boot项目中进行代码混淆,可以选择合适的工具,并根据项目的具体情况进行相应的配置和操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Spring Boot 2.x系列【27】应用篇之代码混淆](https://blog.youkuaiyun.com/qq_43437874/article/details/127964743)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [springboot项目代码混淆和反编译教程·附软件连接](https://blog.youkuaiyun.com/weixin_45095396/article/details/121564461)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Springboot - 代码混淆](https://blog.youkuaiyun.com/trustnature/article/details/121668832)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值