對SpringBoot項目Jar包進行加密防止反編譯的方案
場景:
最近項目要求部署到其他公司的服務(wù)器上,但是又不想將源碼泄露出去。要求對正式環(huán)境的啟動包進行安全性處理,防止客戶直接通過反編譯工具將代碼反編譯出來。
方案:
第一種方案使用代碼混淆
采用proguard-maven-plugin插件
在單模塊中此方案還算簡單,但是現(xiàn)在項目一般都是多模塊,一個模塊依賴多個公共模塊。那么使用此方案就比較麻煩,配置復(fù)雜,文檔難懂,各模塊之間的調(diào)用在是否混淆時極其容易出錯。
第二種方案使用代碼加密
采用classfinal-maven-plugin插件
此方案比對上面的方案來說,就簡單了許多。直接配置一個插件就可以實現(xiàn)源碼的安全性保護。并且可以對yml、properties配置文件以及l(fā)ib目錄下的maven依賴進行加密處理。若想指定機器啟動,支持綁定機器,項目加密后只能在特定機器運行。
項目操作:
只需要在啟動類的pom.xml文件中加如下插件即可,需要注意的是,改插件時要放到spring-boot-maven-plugin插件后面,否則不起作用。
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <!-- 1. 加密后,方法體被清空,保留方法參數(shù)、注解等信息.主要兼容swagger文檔注解掃描 2. 方法體被清空后,反編譯只能看到方法名和注解,看不到方法體的具體內(nèi)容 3. 加密后的項目需要設(shè)置javaagent來啟動,啟動過程中解密class,完全內(nèi)存解密,不留下任何解密后的文件 4. 啟動加密后的jar,生成xxx-encrypted.jar,這個就是加密后的jar文件,加密后不可直接執(zhí)行 5. 無密碼啟動方式,java -javaagent:xxx-encrypted.jar -jar xxx-encrypted.jar 6. 有密碼啟動方式,java -javaagent:xxx-encrypted.jar='-pwd= 密碼' -jar xxx-encrypted.jar --> <groupId>net.roseboy</groupId> <artifactId>classfinal-maven-plugin</artifactId> <version>1.2.1</version> <configuration> <password>#</password><!-- #表示啟動時不需要密碼,事實上對于代碼混淆來說,這個密碼沒什么用,它只是一個啟動密碼 --> <excludes>org.spring</excludes> <packages>${groupId}</packages><!-- 加密的包名,多個包用逗號分開 --> <cfgfiles>application.yml,application-dev.yml</cfgfiles><!-- 加密的配置文件,多個包用逗號分開 --> <libjars>hutool-all.jar</libjars> <!-- jar包lib下面要加密的jar依賴文件,多個包用逗號分開 --> <code>xxxx</code> <!-- 指定機器啟動,機器碼 --> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>classFinal</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
啟動方式
無密碼啟動:java -javaagent:xxx-encrypted.jar -jar xxx-encrypted.jar
有密碼啟動:
java -javaagent:xxx-encrypted.jar='-pwd=密碼' -jar xxx-encrypted.jar
反編譯效果
啟動包加密之后,方法體被清空,保留方法參數(shù)、注解等信息.主要兼容swagger文檔注解掃描
反編譯只能看到方法名和注解,看不到方法體的具體內(nèi)容
啟動過程中解密class,完全內(nèi)存解密,不留下任何解密后的文件
yml配置文件留下空白
綁定機器啟動
下載到classfinal-fatjar-1.2.1.jar依賴,在當(dāng)前依賴下cmd執(zhí)行java -jar classfinal-fatjar-1.2.1.jar -C
命令,會自動生成一串機器碼
將此生成好的機器碼,放到maven插件中的code里面即可。這樣,打包好的項目只能在生成機器碼的機器運行,其他機器則啟動不了項目。
以上就是對SpringBoot項目Jar包進行加密防止反編譯的方案的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Jar包加密防反編譯的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
minio的下載和springboot整合minio使用方法
本文介紹了如何通過Docker拉取MinIO鏡像,并創(chuàng)建MinIO容器的過程,首先,需要在本地創(chuàng)建/data和/conf兩個目錄用于掛載MinIO的數(shù)據(jù)和配置文件,接下來,通過docker?run命令啟動容器,設(shè)置MinIO的訪問端口、用戶名、密碼等信息,感興趣的朋友一起看看吧2024-09-09Struts2學(xué)習(xí)筆記(7)-訪問Web元素
這篇文章主要介紹Struts2中訪問Web元素的方法,希望能給大家做一個參考。2016-06-06SpringBoot優(yōu)雅接收前端請求參數(shù)的詳細(xì)過程
這篇文章主要介紹了SpringBoot如何優(yōu)雅接收前端請求參數(shù),我們可以通過@RequestParm注解去綁定請求中的參數(shù),將(查詢參數(shù)或者form表單數(shù)據(jù))綁定到controller的方法參數(shù)中,本文結(jié)合示例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2023-06-06Java實現(xiàn)的文件上傳下載工具類完整實例【上傳文件自動命名】
這篇文章主要介紹了Java實現(xiàn)的文件上傳下載工具類,結(jié)合完整實例形式分析了java針對文件上傳下載操作的相關(guān)實現(xiàn)技巧,并且針對上傳文件提供了自動命名功能以避免文件命名重復(fù),需要的朋友可以參考下2017-11-11java使用freemarker模板生成html再轉(zhuǎn)為pdf
這篇文章主要為大家詳細(xì)介紹了java如何使用freemarker模板生成html,再利用iText將生成的HTML轉(zhuǎn)換為PDF文件,感興趣的小伙伴可以參考下2025-04-04SpringBoot實現(xiàn)RabbitMQ三種使用方式
本文主要介紹了SpringBoot實現(xiàn)RabbitMQ三種使用方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07在SpringBoot 中從application.yml中獲取自定義常量方式
這篇文章主要介紹了在SpringBoot 中從application.yml中獲取自定義常量方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04SpringBoot項目設(shè)置斷點debug調(diào)試無效忽略web.xml問題的解決
這篇文章主要介紹了SpringBoot項目設(shè)置斷點debug調(diào)試無效忽略web.xml問題的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08如何利用SpringAOP的返回通知處理數(shù)據(jù)加密返回
這篇文章主要介紹了如何利用SpringAOP的返回通知處理數(shù)據(jù)加密返回,本文通過實例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2024-12-12