主頁 > 軟體設計 > 最新版SpringBoot結合ProGuard實作代碼混淆

最新版SpringBoot結合ProGuard實作代碼混淆

2020-10-01 00:29:36 軟體設計

SpringBoot結合ProGuard實作代碼混淆

    • 參考案例
    • 前言
    • ProGuard集成
      • 1.maven的配置
      • 2.相關例外解決
      • 注意事項

參考案例

1、Springboot+proguard+maven 混淆.
2、proguard-spring-boot-example
3、官方解釋
4、Proguard的Keep使用方法
5、ProGuard 最全混淆規則說明
6、ProGuard代碼混淆技術詳解
7、使用proguard混淆springboot代碼

前言

研究ProGuard也花了兩天時間,其實最主要的時間花在前面proguard讀取jar包的時候相關jar沖突的問題,但是總的來說不用拆分SpringBoot專案并且實作代碼混淆已經很舒服了,

ProGuard集成

1.maven的配置

具體配置如下:

<build>
		<finalName>${artifactId}</finalName>
		<plugins>
			<plugin>
				<groupId>com.github.wvengen</groupId>
				<artifactId>proguard-maven-plugin</artifactId>
				<executions>
					<execution>
						<phase>package</phase>
						<goals><goal>proguard</goal></goals>
					</execution>
				</executions>
				<configuration>
					<proguardVersion>6.2.2</proguardVersion>
					<injar>${project.build.finalName}.jar</injar>
					<outjar>${project.build.finalName}.jar</outjar>
					<!--<proguardInclude>${project.basedir}/proguard.cfg</proguardInclude>-->
					<obfuscate>true</obfuscate>
					<options>
						<!-- 不做收縮(洗掉注釋、未被參考代碼)-->
						<option>-dontshrink</option>
						<!-- 不做優化(變更代碼實作邏輯)-->
						<option>-dontoptimize</option>
						<!--保持目錄結構,否則spring的自動注入無法使用-->
						<!--<option>-keepdirectories</option>-->
						<option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
							SourceFile,LineNumberTable, *Annotation*,EnclosingMethod
						</option>
						<option>-adaptclassstrings</option>
						<option>
							<!-- 保護程式入口 -->
							 -keep class com.jingchen.ccny.CmepApplication { *; }
						</option>
						<option>-keepnames interface ** { *; }</option>
						<!-- 固定幾個類不能混淆-->
						<option>-keepnames class com.jingchen.ccny.base.BaseService { *; }</option>
						<option>-keep class com.jingchen.ccny.common.cache.ConvertorNewCache { *; }</option>
						<option>-keep class com.jingchen.ccny.base.ControllerContext { *; }</option>
						<option>-keep class * extends com.jingchen.ccny.base.BaseService</option>
						<option>-keep class * implements com.jingchen.ccny.common.service.CallBackGuiService</option>
						<option>-keep class * implements com.jingchen.ccny.common.service.CallBackUDService</option>
						<option>-keep class com.jingchen.ccny.util.SpringUtil</option>
						<!--<option>-keep interface * extends * { *; }</option>-->
						<!-- 此選項將在所有包的所有類中保存所有原始定義的注釋.-->
						<option>
							    -keep class * {
							@org.springframework.beans.factory.annotation.Autowired *;
							@org.springframework.beans.factory.annotation.Value *;
							@org.springframework.stereotype.Service *;
							@org.springframework.stereotype.Component *;
							@org.springframework.scheduling.annotation.Scheduled *;

							}
						</option>
					</options>
					<libs>
						<!-- Include main JAVA library required.-->
						<lib>${java.home}/lib/rt.jar</lib>
						<lib>${java.home}/lib/jce.jar</lib>
					</libs>
				</configuration>
				<dependencies>
					<dependency>
						<groupId>net.sf.proguard</groupId>
						<artifactId>proguard-base</artifactId>
						<version>6.2.2</version>
					</dependency>
				</dependencies>
			</plugin>

			<!-- Maven assembly must be run after proguard obfuscation so it take already obfuscated files.-->
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<executions>
					<execution>
						<goals>
							<goal>repackage</goal>
						</goals>
						<configuration>
							<mainClass>com.jingchen.ccny.CcnyApplication</mainClass>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

這里里面級聯參考的jar很多,建議配置了私服的人先把鏡像地址配置成maven中央倉庫地址,這樣先下下來相關依賴的包,然后再上傳到你們的私服上去,據我研究中知道的jar就有:
在這里插入圖片描述

注意:不連外網配置maven中央倉庫的話,少了jar你們會很頭疼的,而且不止net.sf.proguard相關包,還包括了com.guardsquare.proguard-base 和 com.guardsquare.proguard-core 相關的jar,所以真的連外網下包很重要!!!!

推薦一個IDEA解決maven參考沖突的插件:Maven Helper

2.相關例外解決

  • idea A required class was missing … org/apache/tools/ant/BuildListener
    問題原因
    這個問題就是上面提到的因為apache的編譯用了一個ant-1.9.3的包,這個是級聯參考的,開始我是內網maven私服,單純的引入net.sf.proguard相關和com.github.wvengen相關的jar還是會缺少很多jar
    解決方案
    連上外網,配置你的maven的setting.xml 的mirror鏡像地址,配置成Maven中央倉庫的地址,將相關的jar都下下來,然后再通過命令把你本地maven倉庫的jar上傳到私服去
  • Can’t process class [META-INF/versions/9/org/apache/logging/log4j/util/Base64Util.class]
  • Can’t process class [META-INF/versions/11/module-info.class]
    問題原因
    這個問題的原因有很多方面,最主要的就是我們的jdk版本是1.8,我最開始用的ProGuard是5.3.3版本,然而我們SpringBoot的版本是2.3.3版本,SpringBoot2.3.3版本太新了,里面參考的相關包都是java9和java11的版本,這樣ProGuard在讀jar的時候會無法識別,這些問題在提升Proguard版本到6.2.2之后都解決了
    解決方案
    開始我的解決方案是忽略這些相關的jar, 例如在pom.xml的option配置:
<option>-libraryjars  ${settings.localRepository}/com/zaxxer/HikariCP/3.4.5/HikariCP-3.4.5.jar(META-INF/versions/11/module-info.class)</option>

但是我這樣配置之后,重新打包會提示:

  • The same input jar [E:\maven\repo\com\zaxxer\HikariCP\3.4.5\HikariCP-3.4.5.jar] is specified twice.
    解決方案:參考
    而且我還嘗試了maven參考的時候排除這些高版本的級聯參考jar,單獨參考低版本,但最侄訓是因為太繁瑣而放棄了,直接提升Proguard版本到6.2.2 這些讀jar的版本問題就解決了,
  • Annotation-specified bean name ‘a’ for bean class
    問題原因
    出現這個問題主要還是混淆之后,bean重名了,spring默認是把類名的首字母小寫加載到容器里面,我們混淆類名之后,就容易造成beanName重復,
    解決方案
    慶幸的是,我們可以通過改變spring加載bean的命名策略來解決這個問題,把包名帶上,同時在獲取Spring背景關系getBean的時候,加上包名路徑即可
    啟動類配置,具體如下:
@SpringBootApplication
public class CcnyApplication{

	public static class CustomGenerator implements BeanNameGenerator {

		@Override
		public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
			return definition.getBeanClassName();
		}
	}

	public static void main(String[] args) {
		SpringApplicationBuilder sab=new SpringApplicationBuilder(CcnyApplication.class)
				.beanNameGenerator(new CustomGenerator());
		//這里如果想列印你加載的Spring的bean,可以這樣做:
		ApplicationContext ac =sab.run(args);
		Arrays.stream(ac.getBeanDefinitionNames()).forEach(System.out::println);
	}
}

這樣配置,你啟動的時候就能看到加載的所有的beanName(這里Service會帶上package路徑)

其他地方getBean的用法:

//這里的packagePath = com.jingchen.ccny.service
CallBackGuiService callBackGuiService = (CallBackGuiService) SpringUtil.getBean(packagePath+serviceName);
                    callBackResult = callBackGuiService.excute(convertMap);

這樣你就能正常的獲取到Spring容器加載的beanName了

注意事項

  • 基本上影響打包和啟動的就上面一些問題了,其他的就是你們專案里面的細節了,
  • 比如DAO要保留,要和mybatis里面的Mapper映射對應,DAO里面的方法傳參要改為map或者物體,另外序列化后的物體要保留
  • Controller里面的方法入參,如果用了物體,這部分物體也要保留(保證其變數不會被混淆,不然傳值收不到)
  • 另外就是你們spring相關的XML里面,如果單獨配置了Bean和Bean屬性的,這類bean要保留,不能被混淆
  • 我這里保留了所有的介面和介面里面的方法,已經我們自定義的抽象類BaseService里面的方法名不會被混淆,這些你們可以自己定義,而且我這里定義了有標注@Component的類也保留類名,按照我上面的配置,基本上可以不用重新構建beanName,正常的application啟動就完事了
  • 其他的沒了,就看你們還有沒有什么特定的類不能被混淆,以及你們要混淆的力度(我們的要求是保留所有類名、介面資訊和抽象類資訊,除此之外的所有類和方法都被混淆!)

總的來說花了兩天時間,有這樣的成果也是值得高興的,前一天解決jar沖突的比較多,主要原因就是最開始XX架構師搭建這個專案采用最新的SpringBoot版本,jdk確是1.8 , 很多不兼容,

來個最終的效果圖吧:
在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/143610.html

標籤:其他

上一篇:美團3面(Java后臺):NIO+BIO+Zookeeper+執行緒池+Redis+kafka

下一篇:【優雅的避坑】new HashMap(list.size())指定size就能完全避免擴容帶來的額外開銷了嗎?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more