SpringBoot專案Jar包加密,防止反編譯

👉 這是一個或許對你有用的社群
🐱 一對一交流/面試小冊/簡歷最佳化/求職解惑,歡迎加入芋道快速開發平臺知識星球。下面是星球提供的部分資料:

👉這是一個或許對你有用的開源專案
國產 Star 破 10w+ 的開源專案,前端包括管理後臺 + 微信小程式,後端支援單體和微服務架構。
功能涵蓋 RBAC 許可權、SaaS 多租戶、資料許可權、商城、支付、工作流、大屏報表、微信公眾號等等功能:
  • Boot 地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • Cloud 地址:https://gitee.com/zhijiantianya/yudao-cloud
  • 影片教程:https://doc.iocoder.cn


1 場景

最近專案要求部署到其他公司的伺服器上,但是又不想將原始碼洩露出去。要求對正式環境的啟動包進行安全性處理,防止客戶直接透過反編譯工具將程式碼反編譯出來。
基於 Spring Boot + MyBatis Plus + Vue & Element 實現的後臺管理系統 + 使用者小程式,支援 RBAC 動態許可權、多租戶、資料許可權、工作流、三方登入、支付、簡訊、商城等功能
  • 專案地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 影片教程:https://doc.iocoder.cn/video/

2 方案

第一種方案使用程式碼混淆
採用proguard-maven-plugin外掛
在單模組中此方案還算簡單,但是現在專案一般都是多模組,一個模組依賴多個公共模組。那麼使用此方案就比較麻煩,配置複雜,文件難懂,各模組之間的呼叫在是否混淆時極其容易出錯。
第二種方案使用程式碼加密
採用classfinal-maven-plugin外掛
此方案比對上面的方案來說,就簡單了許多。直接配置一個外掛就可以實現原始碼的安全性保護。並且可以對yml、properties配置檔案以及lib目錄下的maven依賴進行加密處理。若想指定機器啟動,支援繫結機器,專案加密後只能在特定機器執行。
ClassFinal專案原始碼地址 [1]
基於 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的後臺管理系統 + 使用者小程式,支援 RBAC 動態許可權、多租戶、資料許可權、工作流、三方登入、支付、簡訊、商城等功能
  • 專案地址:https://github.com/YunaiV/yudao-cloud
  • 影片教程:https://doc.iocoder.cn/video/

3 專案操作

只需要在啟動類的pom.xml檔案中加如下外掛即可,需要注意的是,改外掛時要放到spring-boot-maven-plugin外掛後面,否則不起作用。
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><!--                1. 加密後,方法體被清空,保留方法引數、註解等資訊.主要相容swagger文件註解掃描                2. 方法體被清空後,反編譯只能看到方法名和註解,看不到方法體的具體內容                3. 加密後的專案需要設定javaagent來啟動,啟動過程中解密class,完全記憶體解密,不留下任何解密後的檔案                4. 啟動加密後的jar,生成xxx-encrypted.jar,這個就是加密後的jar檔案,加密後不可直接執行                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>

4 啟動方式

無密碼啟動
java -javaagent:xxx-encrypted.jar -jar xxx-encrypted.jar
有密碼啟動
java -javaagent:xxx-encrypted.jar='-pwd=密碼' -jar xxx-encrypted.jar

5 反編譯效果

啟動包加密之後,方法體被清空,保留方法引數、註解等資訊.主要相容swagger文件註解掃描
反編譯只能看到方法名和註解,看不到方法體的具體內容
啟動過程中解密class,完全記憶體解密,不留下任何解密後的檔案

yml配置檔案留下空白

6 繫結機器啟動

下載到classfinal-fatjar-1.2.1.jar [2]依賴,在當前依賴下cmd執行java -jar classfinal-fatjar-1.2.1.jar -C命令,會自動生成一串機器碼

將此生成好的機器碼,放到maven外掛中的code裡面即可。這樣,打包好的專案只能在生成機器碼的機器執行,其他機器則啟動不了專案。

歡迎加入我的知識星球,全面提升技術能力。
👉 加入方式,長按”或“掃描”下方二維碼噢

星球的內容包括:專案實戰、面試招聘、原始碼解析、學習路線。

文章有幫助的話,在看,轉發吧。
謝謝支援喲 (*^__^*)

相關文章