java代碼混淆

來源:互聯網
上載者:User

標籤:images   cat   optimize   src   代碼實現   proguard   jdk   txt   method   

僅做記錄之用。  

  java代碼可以反編譯,因此有時候要保護自己的智慧財產權還真得費點心思,一般來說有三個思路:  1、將class檔案加密,這個是最安全的,但也費事兒,因為要重寫classloader來揭秘class檔案;  2、使用花指令,使得class檔案不能反編譯(利用反編譯工具漏洞);安全性一般,還是有花指令破解器;  3、代碼混淆,提高代碼閱讀成本;簡單易操作,一般採用這種或者與其它方式結合;  我們項目中用到的即為代碼混淆工具ProGuard,相關文章參考:  http://blog.csdn.net/wltj920/article/details/48970869  http://blog.csdn.net/earbao/article/details/51000108  ProGuard是一個純java編寫的混淆工具,有用戶端跟jar包兩種使用方式。可以將程式打包為jar,然後用工具進行混淆,也可以在maven中匯入ProGuard的外掛程式,對代碼進行混淆。本例中為對普通javaweb項目進行代碼混淆。maven配置外掛程式如下:
<!-- ProGuard混淆外掛程式--><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>      <!-- 指定組建檔案分類 -->      <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 -DskipTests

  混淆後結果:  classes-pg.jar為混淆後的classes檔案,裡邊包含完整的項目結構  proguard_map.txt混淆內容映射  proguard_seed.txt參與混淆的類  混淆後反編譯代碼如下:   可以看到,部分包名跟類名已經被改為了簡單字母,不再具有業務含義,而且變數名也進行了修改,增加了閱讀代碼難度。  運行服務,項目正常運行。  需要注意的問題:  1、因為有時候會配置不保持包名或類名,因此一些相關設定檔的內容需要改變,好在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,而不是原來的大寫類名,從而避免錯誤。  2、打包部署問題。該設定檔打包出來的war中classes檔案仍然為正常代碼,需要手動解壓,將classes-pg.jar中classes替換進去,在工程化管理的情況下,可以在jenkins中配置指令碼,自動將混淆後的classes替換進war包:
#更改war包classes為混淆包的內容cd /root/.jenkins/workspace/mytest_master/targetjar -xvf classes-pg.jarrm -rf mytestmkdir mytestmv mytest.war mytestcd mytest/jar -xvf mytest.warrm -rf WEB-INF/classes/com/cd ../cp -rf com mytest/WEB-INF/classes/cd mytestjar -cvfM0 mytest.war ./mv mytest.war ../#刪掉原來tomcat中war包跟項目,否則授權檔案無法替換cd /usr/local/apache-tomcat-8.5.23/webappsrm -f mytest.warrm -rf mytest 
這樣jenkins打出的就是混淆後的war包了,可以直接交給客戶使用。

     

java代碼混淆

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.