最近計畫要求部署到其他公司的伺服器上,但是又不想將源碼泄露出去。 要求對正式環境的啟動包進行安全性處理,防止客戶直接透過反編譯工具將程式碼反編譯出來。
2 方案
第一種方案使用程式碼混淆
采用proguard-maven-plugin外掛程式
在單模組中此方案還算簡單,但是現在計畫一般都是多模組,一個模組依賴多個公共模組。那麽使用此方案就比較麻煩,配置復雜,文件難懂,各模組之間的呼叫在是否混淆時極其容易出錯。
第二種方案使用程式碼加密
采用 classfinal-maven-plugin外掛程式
此方案比對上面的方案來說,就簡單了許多。直接配置一個外掛程式就可以實作源碼的安全性保護。並且可以對yml、properties配置檔以及lib目錄下的maven依賴進行加密處理。若想指定機器啟動,支持繫結機器,計畫加密後只能在特定機器執行。
classFinal計畫源碼地址 : https:/ /gitee.com/roseboy/ classfinal
計畫操作
只需要在啟動類的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>
啟動方式
無密碼啟動
java -javaagent:xxx-encrypted.jar -jar xxx-encrypted.jar
有密碼啟動
java -javaagent:xxx-encrypted.jar='-pwd=密碼' -jar xxx-encrypted.jar
反編譯效果
啟動 包加密 之後,方法體被清空,保留方法參數、註解等資訊.主要相容swagger文件註解掃描
反編譯只能看到方法名和註解,看不到方法體的具體內容
啟動過程中解密 class,完全記憶體解密,不留下任何解密後的檔
yml配置檔留下空白
繫結機器啟動
下載到
classfinal-fatjar-1.2.1.jar
依賴,在當前依賴下cmd執行
java -jar classfinal-fatjar-1.2.1.jar -C
命令,會自動生成一串機器碼
將此生成好的機器碼,放到maven外掛程式中的code裏面即可。這樣,打包好的計畫只能在生成機器碼的機器執行,其他機器則啟動不了計畫。
文章來源:https://juejin.cn/post/7291846601651273769
>>
END
精品資料,超贊福利,免費領
微信掃碼/長按辨識 添加【技術交流群】
群內每天分享精品學習資料
最近開發整理了一個用於速刷面試題的小程式;其中收錄了上千道常見面試題及答案(包含基礎、並行、JVM、MySQL、Redis、Spring、SpringMVC、SpringBoot、SpringCloud、訊息佇列等多個型別),歡迎您的使用。
👇👇
👇點選"閱讀原文",獲取更多資料(持續更新中)