javaEE防盜版-ProGuard 混淆技術

這裏介紹一些java的混淆技術。混淆主要是爲了保護產權,增加代碼反編譯後的閱讀難度。

本文介紹的是ProGuard來進行代碼混淆,集成在Maven環境中。常規環境的混淆技術以後再做介紹了。

混淆效果簡介

public class User {
    public String username;
    public String password;
    public String getMsg(){
        return ""+username + "|" + password;
    }
}

混淆後

public class AA {
    public String aa;
    public String bb;
    public String cc(){
        return ""+aa + "|" + bb;
    }
}

上面的只是僞代碼,真是代碼請以實際配置爲準。

個人感覺混淆還是在業務邏輯比較複雜,變量多,並且有大量private方法的類中效果比較好。(因爲public方法對外提供,因此不建議混淆public的方法名,但是局部變量名就無所謂了)。還有一些混淆工具會在混淆過程中添加大量無效代碼。。。

POM.xml

<plugin>
  <groupId>com.github.wvengen</groupId>
  <artifactId>proguard-maven-plugin</artifactId>
  <version>2.0.11</version>
  <executions>
    <execution>
      <!-- 混淆時刻,這裏是打包的時候混淆-->
      <phase>package</phase>
      <goals>
        <!-- 使用插件的什麼功能-->
        <goal>proguard</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <!-- 是否將生成的PG文件安裝部署-->
    <attach>true</attach>
    <!-- 是否混淆-->
    <obfuscate>true</obfuscate>
    <options>
      <!-- JDK目標版本 -->
      <option>-target 1.6</option>
      <!-- 不做收縮(刪除註釋、未被引用代碼)-->
      <option>-dontshrink</option>
      <!-- 保留註解,這個不加可能會導致混淆後的class文件註解丟失 -->
      <option>-keepattributes *Annotation*</option>
      
      <!-- 不做優化(變更代碼實現邏輯)-->
      <option>-dontoptimize</option>
      <!-- 加上以下的,不會混淆私有方法 -->
      <!-- <option>-dontskipnonpubliclibraryclasses</option> -->
      <!-- <option>-dontskipnonpubliclibraryclassmembers</option> -->
      <!-- 優化時允許訪問並修改有修飾符的類和類的成員 -->
      <option>-allowaccessmodification</option>
      <!-- 確定統一的混淆類的成員名稱來增加混淆-->
      <option>-useuniqueclassmembernames</option>
      
      <!-- 忽略所有警告,否則有警告的時候混淆會停止 -->
      <option>-ignorewarnings</option>
      <!-- 目標路徑,一般直接定位到target的classes下 -->
      <option>-injars target/classes</option>
      <!-- 輸出路徑,混淆後的文件,打成了jar包 -->
      <option>-outjars target/noryar.jar</option>
      
      <!-- 不混淆所有包名,本人測試混淆後WEB項目問題實在太多,畢竟Spring配置中有大量固定寫法的包名-->
      <option>-keeppackagenames</option>
      <!-- 不混淆包下的所有類名,且類中的方法也不混淆-->
      <option>-keep class com.noryar.doall.** { *; }</option>
      <!-- 不混淆包下的所有類名,不混淆方法名 -->
      <option>-keep class com.noryar.protectedMethod.** { <methods>; }</option>
      
    </options>
    <!-- 添加依賴,目前rt.jar如果不加可能會導致混淆失敗 -->
    <libs>
      <lib>${java.home}/lib/rt.jar</lib>
      <lib>${java.home}/lib/jce.jar</lib>
    </libs>
  </configuration>
</plugin>



這裏介紹一下option - keep規則吧,一般的寫法就是上面那樣 ** 可以匹配任意的包下的類 , {*;} 代表成員和屬性都不進行混淆

{<methods>;} 代表所有的方法都不進行混淆

上面兩個可以根據自己的需要進行修改,注意<>符號需要轉譯成&lt; &gt; 

詳細的操作說明,官網上都有, 地址: http://proguard.sourceforge.net/


此外,爲了更好的保護代碼,混淆技術和加密技術聯合使用效果更佳喲~,詳細方案會在另一篇日誌講述~


補充

混淆內存溢出

在配置文件中加上<maxMemory>1024m</maxMemory>

發佈了37 篇原創文章 · 獲贊 16 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章