java代碼混淆(使用 ProGuard maven插件)

java代碼能夠反編譯,所以有時候要保護本身的知識產權還真得費點心思,通常來講有三個思路:html

一、將class文件加密,這個是最安全的,但也費事兒,由於要重寫classloader來解密class文件;java

二、使用花指令,使得class文件不能反編譯(利用反編譯工具漏洞);安全性通常,仍是有花指令破解器;git

三、代碼混淆,提升代碼閱讀成本;簡單易操做,通常採用這種或者與其它方式結合;github

  咱們項目中用到的即爲代碼混淆工具ProGuard,相關文章參考:web

  http://blog.csdn.net/earbao/article/details/51000108安全

  ProGuard是一個純java編寫的混淆工具,有客戶端跟jar包兩種使用方式。能夠將程序打包爲jar,而後用工具進行混淆,也能夠在maven中導入ProGuard的插件,對代碼進行混淆。本例中爲對普通javaweb項目進行代碼混淆。maven配置插件以下:bash

<!-- ProGuard混淆插件-->
<plugin>
  <groupId>com.github.wvengen</groupId>
  <artifactId>proguard-maven-plugin</artifactId>
  <version>2.2.0</version>
  <executions>
    <execution>
      <!-- 混淆時刻,這裏是打包的時候混淆-->
      <phase>package</phase>
      <goals>
        <!-- 使用插件的什麼功能,固然是混淆-->
        <goal>proguard</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <!-- 是否將生成的PG文件安裝部署-->
    <attach>true</attach>

    <!-- 是否混淆-->
    <obfuscate>true</obfuscate>

    <!-- 指定生成文件分類 -->
    <attachArtifactClassifier>pg</attachArtifactClassifier>
    <options>
      <!-- JDK目標版本1.8-->
      <option>-target 1.8</option>

      <!-- 不作收縮(刪除註釋、未被引用代碼)-->
      <option>-dontshrink</option>

      <!-- 不作優化(變動代碼實現邏輯)-->
      <option>-dontoptimize</option>

      <!-- 不路過非公用類文件及成員-->
      <option>-dontskipnonpubliclibraryclasses</option>
      <option>-dontskipnonpubliclibraryclassmembers</option>

      <!--不用大小寫混合類名機制-->
      <option>-dontusemixedcaseclassnames</option>

      <!-- 優化時容許訪問並修改有修飾符的類和類的成員 -->
      <option>-allowaccessmodification</option>

      <!-- 肯定統一的混淆類的成員名稱來增長混淆-->
      <option>-useuniqueclassmembernames</option>

      <!-- 不混淆全部包名-->
      <!--<option>-keeppackagenames</option>-->

      <!-- 須要保持的屬性:異常,註解等-->
      <option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod</option>
      <!-- 不混淆全部的set/get方法-->
      <!--<option>-keepclassmembers public class * {void set*(***);*** get*();}</option>-->

      <!-- 不混淆包下的全部類名,且類中的方法也不混淆-->
      <!--<option>-keep class com.xxx.xxx.bboss.SystemConfig { <methods>; }</option>-->
      <!--<option>-keep class com.xxx.xxx.framework.** { *; }</option>-->
      <!--<option>-keep class com.xxx.xxx.xxx.controller.** { <methods>; }</option>-->
      <!--<option>-keep class com.xxx.xxx.xxx.dao.** { <methods>; }</option>-->
      <!--<option>-keep class com.xxx.xxx.xxx.exception { <methods>; }</option>-->
      <!--<option>-keep class com.xxx.xxx.xxx.model.** { <methods>; }</option>-->
    </options>

    <!--class 混淆後輸出的jar包-->
    <outjar>classes-autotest.jar</outjar>

    <!-- 添加依賴,這裏你能夠按你的須要修改,這裏測試只須要一個JRE的Runtime包就好了 -->
    <!--<libs>-->
    <!--    <lib>${java.home}/lib/rt.jar</lib>-->
    <!--</libs>-->

    <!-- 對什麼東西進行加載,這裏僅有classes成功,畢竟你也不可能對配置文件及JSP混淆吧-->
    <!--<injar>classes</injar>-->

    <!-- 輸出目錄-->
    <!--<outputDirectory>${project.build.directory}</outputDirectory>-->
  </configuration>
</plugin>

   運行 mvn clean package -DskipTestsmaven

  混淆後結果如圖所示:工具

  classes-pg.jar爲混淆後的classes文件,裏邊包含完整的項目結構測試

  proguard_map.txt混淆內容映射

  proguard_seed.txt參與混淆的類

  混淆後反編譯代碼以下:

 

  能夠看到,部分包名跟類名已經被改成了簡單字母,再也不具備業務含義,並且變量名也進行了修改,增長了閱讀代碼難度。

  運行服務,項目正常運行。

  須要注意的問題:

  一、隨機生成類名問題

        由於有時候會配置不保持包名或類名,所以一些相關配置文件的內容須要改變,好在ProGuard不是隨機生成類名,而是先按照原名稱對相同包下類進行排序,混淆後的類名稱依次爲a.class,b.class,c.class.....

        當包中超過26個類時,默認命名爲A.class,B.class,C.class,在某些操做系統下,會不區分class文件名稱的大小寫,會致使錯誤(水平所限,未深刻探究跟類加載相關);

所以,不用大小寫混合類名機制:

<!--不用大小寫混合類名機制-->
<option>-dontusemixedcaseclassnames</option>

  配置極爲關鍵,該配置會在超過26個類文件時,命名爲aa.class,ab.class,ac.class,而不是原來的大寫類名,從而避免錯誤。

  二、打包部署問題。

       該配置文件打包出來的war中classes文件仍然爲正常代碼,須要手動解壓,將classes-pg.jar中classes替換進去,在工程化管理的狀況下,能夠在jenkins中配置腳本,自動將混淆後的classes替換進war包:

#更改war包classes爲混淆包的內容
cd /root/.jenkins/workspace/mytest_master/target
jar -xvf classes-pg.jar
rm -rf mytest
mkdir mytest
mv mytest.war mytest
cd mytest/
jar -xvf mytest.war
rm -rf WEB-INF/classes/com/
cd ../
 
cp -rf com mytest/WEB-INF/classes/
cd mytest
jar -cvfM0 mytest.war ./
mv mytest.war ../

 這樣jenkins打出的就是混淆後的war包了,能夠直接交給客戶使用。

相關文章
相關標籤/搜索