使用allatori對(duì)SpringBoot多模塊代碼進(jìn)行混淆

使用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:
20200319174413400_7710.png
20200319174648091_6084.png

在這里可以執(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

  1. 首先,看一下項(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目錄拿到)

  1. 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>
  1. 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)文檔

  1. 打包

配置好之后就可以打包了占拍,如下圖所示

20200319181646959_6272.png

在根目錄下執(zhí)行命令:mvn package -DskipTests

當(dāng)你看到下圖時(shí),說(shuō)明多半你的代碼已經(jīng)混淆成功了捎迫,至于能不能用還有待驗(yàn)證


20200319181519149_15266.png

執(zhí)行成功之后晃酒,在項(xiàng)目的target目錄下會(huì)生成你想要的jar包


20200319181857489_19525.png

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


20200323134057160_17693.png
并把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配置柑贞,如下圖:

20200323135315421_26515.png
20200323135344108_10747.png

優(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)行混淆励七;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者奔缠。
  • 序言:七十年代末掠抬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子校哎,更是在濱河造成了極大的恐慌两波,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闷哆,死亡現(xiàn)場(chǎng)離奇詭異腰奋,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)抱怔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)劣坊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人屈留,你說(shuō)我怎么就攤上這事局冰。” “怎么了灌危?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵康二,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我乍狐,道長(zhǎng)赠摇,這世上最難降的妖魔是什么固逗? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任浅蚪,我火速辦了婚禮藕帜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惜傲。我一直安慰自己洽故,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布盗誊。 她就那樣靜靜地躺著时甚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哈踱。 梳的紋絲不亂的頭發(fā)上荒适,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音开镣,去河邊找鬼刀诬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛邪财,可吹牛的內(nèi)容都是我干的陕壹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼树埠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼糠馆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起怎憋,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤又碌,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后绊袋,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體赠橙,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年愤炸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了期揪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡规个,死狀恐怖凤薛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诞仓,我是刑警寧澤缤苫,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站墅拭,受9級(jí)特大地震影響活玲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一舒憾、第九天 我趴在偏房一處隱蔽的房頂上張望镀钓。 院中可真熱鬧,春花似錦镀迂、人聲如沸丁溅。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)窟赏。三九已至,卻和暖如春箱季,著一層夾襖步出監(jiān)牢的瞬間涯穷,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工藏雏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留求豫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓诉稍,卻偏偏與公主長(zhǎng)得像蝠嘉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子杯巨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容