使用allatori對(duì)SpringBoot多模塊代碼進(jìn)行混淆
代碼混淆介紹
1.由于項(xiàng)目需要私有化部署咨油,為了保證代碼的安全性状答,需要對(duì)springboot項(xiàng)目進(jìn)項(xiàng)代碼混淆色解,代碼混淆顧名思義就是把代碼變得讓人看不懂惫周,那么看不懂了又怎么運(yùn)行呢按价,其實(shí)混淆主要混淆一些關(guān)鍵性的業(yè)務(wù)性代碼惭适,把關(guān)于業(yè)務(wù)邏輯的一部分代碼變量名稱變成a,b,c,d,e,f,g...就讓人讀起來(lái)很難理解。但是話又說(shuō)回來(lái)楼镐,由于代碼的特殊性癞志,像mybatis一樣,如果把變量名都改了框产,xml文件能映射到對(duì)象嗎今阳?答案是否定的师溅。所以在代碼混淆時(shí)需要排除掉一些可能會(huì)有問(wèn)題的方法和類。下面就讓我們一起來(lái)從零混淆一個(gè)springboot的項(xiàng)目吧盾舌。
官方案例
[官網(wǎng)](http://www.allatori.com/)
可以先看一下官網(wǎng)的案例墓臭,解壓官網(wǎng)給的demo:
在這里可以執(zhí)行官網(wǎng)給的demo,并查看混淆后的代碼妖谴。
當(dāng)然如果你只有一個(gè)項(xiàng)目窿锉,并且混淆次數(shù)也不多,你也可以通過(guò)這種方式膝舅,把項(xiàng)目拷貝到這個(gè)目錄嗡载,修改配置文件,手動(dòng)執(zhí)行混淆的腳本仍稀。也是沒(méi)毛病的洼滚。
但是,我們既然是springboot項(xiàng)目技潘,必然會(huì)有多個(gè)項(xiàng)目遥巴,如果這么搞是不是得搞死。享幽。铲掐。。并且老大也不同意呀值桩!所以摆霉,繼續(xù)往下探索吧,我們要把混淆工具集成到idea中奔坟,通過(guò)mvn打包直接打出混淆后代碼的包携栋。
代碼混淆集成IDE
-
首先,看一下項(xiàng)目的結(jié)構(gòu)
20200319175749497_8376.png
這里咳秉,我先拿一個(gè)項(xiàng)目my_springcloud中的一個(gè)子模塊demo_service來(lái)做混淆婉支,需要修改的地方已經(jīng)標(biāo)紅了,一共3處:添加allatori.xml,修改pom.xml滴某,添加allatori.jar (jar包可以在官網(wǎng)demo的lib目錄拿到)
- pom.xml
<build>
<plugins>
<plugin>
<!-- springboot打包插件 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<!-- resouces拷貝文件插件 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<!-- 執(zhí)行這個(gè)插件的時(shí)候執(zhí)行申明的所有phase -->
<execution>
<id>copy-and-filter-allatori-config</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<!-- 這個(gè)地方需要注意拷貝的文件位置需要是target目錄磅摹,target目錄是最終打jar包存放的位置 -->
<outputDirectory>${basedir}/target</outputDirectory>
<resources>
<resource>
<!-- 這個(gè)地方的文件目錄需要注意滋迈,網(wǎng)上很多目錄都是${basedir}/allatori這個(gè)霎奢,所以才會(huì)需要手動(dòng)拷貝allatori.xml文件到target目錄下,有了這個(gè)mvn會(huì)自動(dòng)幫我們拷貝了 -->
<directory>src/main/resources</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>
<!-- 指定引用的allatori的jar包位置饼灿,這里把jar包放在了根目錄下的lib目錄里 -->
<argument>../lib/allatori.jar</argument>
<!-- 指定代碼混淆時(shí)的配置文件幕侠,因?yàn)槭腔煜付ǖ氖莏ar包,jar包位置在target下,所以我們的allatori.xml也需要拷貝到該目錄下 -->
<argument>${basedir}/target/allatori.xml</argument>
</arguments>
</configuration>
</plugin>
</plugins>
</build>
- allatori.xml文件
<config>
<input>
<!-- in中是待混淆的jar包碍彭,out是混淆后的jar包晤硕,路徑是相對(duì)本配置文件所在位置 -->
<!-- 這個(gè)示例中悼潭,A.jar是工程jar包,B.jar是子模塊jar包 -->
<jar in="demo_service-0.0.1-SNAPSHOT.jar" out="demo_service-0.0.1-SNAPSHOT-obfuscated.jar"/>
<!-- <jar in="../../B/target/B.jar" out="B.jar"/>-->
</input>
<!-- ignore-classes中配置不被混淆的類 -->
<ignore-classes>
<!-- 配置了啟動(dòng)相關(guān)類不被混淆舞箍,保證springboot可以正常啟動(dòng) -->
<class template="class *Application*"/>
<class template="class *springframework*"/>
<class template="class *alibaba*"/>
<class template="class *persistence*"/>
<class template="class *apache*"/>
<class template="class *model*"/>
<class template="class *enums*"/>
<class template="class *repository*"/>
</ignore-classes>
<keep-names>
<!-- 防止部分類舰褪、方法、變量找不到名稱而報(bào)錯(cuò) -->
<!-- 所有方法名稱不變疏橄,parameters="keep"表示方法參數(shù)名也不變 -->
<method template="*(**)" parameters="keep"/>
<!-- com.a.b.c中的類以及其子包中的類的名稱不變 -->
<!-- <class template="class com.a.b.c.*"/>-->
</keep-names>
<property name="log-file" value="log.xml"/>
</config>
還有很多配置可以參考官方文檔:官網(wǎng)文檔
- 打包
配置好之后就可以打包了占拍,如下圖所示
在根目錄下執(zhí)行命令:mvn package -DskipTests
當(dāng)你看到下圖時(shí),說(shuō)明多半你的代碼已經(jīng)混淆成功了捎迫,至于能不能用還有待驗(yàn)證
執(zhí)行成功之后晃酒,在項(xiàng)目的target目錄下會(huì)生成你想要的jar包
jar包拿出來(lái)就可以運(yùn)行了,如果不能運(yùn)行窄绒,就需要看一下錯(cuò)誤信息渠脉,可能是某個(gè)類或方法不能做混淆颤陶,就需要在配置文件中配置相關(guān)類不被混淆
實(shí)際場(chǎng)景
實(shí)際工作中,我們的項(xiàng)目大部分情況下是在自己服務(wù)器上部署的,只有個(gè)別需要私有化部署的項(xiàng)目胶惰,所以我們希望在需要的時(shí)候打開(kāi)混淆的開(kāi)關(guān),生成混淆后的jar包踏堡,不需要的時(shí)候就還按照原有的jar包生成碌燕。我相信有很多公司也是一樣的情況,那下面我們繼續(xù)探索吧倔幼。
方案一:
設(shè)置兩個(gè)pom.xml通過(guò)maven打包配置 mvn package -f allatori-pom.xml,其中原pom.xml保持不變盖腿,在allatori-pom.xml中指定代碼混淆的插件,在jenkins打包中可以通過(guò)配置损同,設(shè)置打包時(shí)指定pom文件
并把pom.xml參數(shù)化翩腐,可以在需要的時(shí)候打出混淆的包,不需要的時(shí)候指定默認(rèn)的pom.xml即可
優(yōu)點(diǎn):清晰明了膏燃,在大部分不需要打代碼混淆包的情況下比較實(shí)用茂卦,原pom不受影響,代碼修改最小化
缺點(diǎn):pom.xml無(wú)法繼承或復(fù)用组哩,新建的allatori-pom.xml需要維護(hù)等龙,添加依賴時(shí)需要多次復(fù)制,否則可能在生成混淆包時(shí)打包錯(cuò)誤
方案二:
pom文件還按照上面例子中修改伶贰,打包時(shí)指定-Dskip=true蛛砰,指跳過(guò)代碼混淆執(zhí)行器,注意:插件exec-maven-plugin在1.5.0以前是有別名的黍衙,別名叫skip泥畅,可以通過(guò)-Dskip=true跳過(guò)執(zhí)行器,1.5.0之后去掉了別名琅翻,需要通過(guò)-Dexec.skip=true跳過(guò)執(zhí)行器位仁,默認(rèn)配置false
打包時(shí)通過(guò)jenkins配置柑贞,如下圖:
優(yōu)點(diǎn):不需要考慮pom.xml維護(hù)問(wèn)題,一次修改聂抢,終身受益
選擇方案二钧嘶,因?yàn)閯傞_(kāi)始不知道有這個(gè)配置項(xiàng)的,所以暫時(shí)采用了方案一琳疏,后邊翻看maven官網(wǎng)康辑,并看了exec-maven-plugin源碼后,發(fā)現(xiàn)了這個(gè)配置項(xiàng)轿亮,所以就改用第二種方案了疮薇。真香!
注意事項(xiàng)
1 如果代碼里請(qǐng)求靜態(tài)資源的方法我注,注意請(qǐng)求路徑的寫(xiě)法按咒。因?yàn)槿绻堑谌綄⒒煜蟮膉ar包導(dǎo)入項(xiàng)目,獲取文件的相對(duì)路徑可能會(huì)不一樣
2 如果方法中有重定向等寫(xiě)法但骨,主要不要將此內(nèi)容進(jìn)行混淆励七;