SpringBoot項(xiàng)目防止反編譯的方案
場(chǎng)景
最近項(xiàng)目要求部署到其他公司的服務(wù)器上,但是又不想將源碼泄露出去。要求對(duì)正式環(huán)境的啟動(dòng)包進(jìn)行安全性處理,防止客戶(hù)直接通過(guò)反編譯工具將代碼反編譯出來(lái)。
方案
第一種方案使用代碼混淆
采用proguard-maven-plugin
插件
在單模塊中此方案還算簡(jiǎn)單,但是現(xiàn)在項(xiàng)目一般都是多模塊,一個(gè)模塊依賴(lài)多個(gè)公共模塊。那么使用此方案就比較麻煩,配置復(fù)雜,文檔難懂,各模塊之間的調(diào)用在是否混淆時(shí)極其容易出錯(cuò)。
第二種方案使用代碼加密
采用classfinal-maven-plugin
插件
此方案比對(duì)上面的方案來(lái)說(shuō),就簡(jiǎn)單了許多。直接配置一個(gè)插件就可以實(shí)現(xiàn)源碼的安全性保護(hù)。并且可以對(duì)yml、properties配置文件以及l(fā)ib目錄下的maven依賴(lài)進(jìn)行加密處理。若想指定機(jī)器啟動(dòng),支持綁定機(jī)器,項(xiàng)目加密后只能在特定機(jī)器運(yùn)行。
項(xiàng)目操作
只需要在啟動(dòng)類(lèi)的pom.xml文件中加如下插件即可,需要注意的是,改插件時(shí)要放到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. 加密后的項(xiàng)目需要設(shè)置javaagent來(lái)啟動(dòng),啟動(dòng)過(guò)程中解密class,完全內(nèi)存解密,不留下任何解密后的文件 4. 啟動(dòng)加密后的jar,生成xxx-encrypted.jar,這個(gè)就是加密后的jar文件,加密后不可直接執(zhí)行 5. 無(wú)密碼啟動(dòng)方式,java -javaagent:xxx-encrypted.jar -jar xxx-encrypted.jar 6. 有密碼啟動(dòng)方式,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><!-- #表示啟動(dòng)時(shí)不需要密碼,事實(shí)上對(duì)于代碼混淆來(lái)說(shuō),這個(gè)密碼沒(méi)什么用,它只是一個(gè)啟動(dòng)密碼 --> <excludes>org.spring</excludes> <packages>${groupId}</packages><!-- 加密的包名,多個(gè)包用逗號(hào)分開(kāi) --> <cfgfiles>application.yml,application-dev.yml</cfgfiles><!-- 加密的配置文件,多個(gè)包用逗號(hào)分開(kāi) --> <libjars>hutool-all.jar</libjars> <!-- jar包lib下面要加密的jar依賴(lài)文件,多個(gè)包用逗號(hào)分開(kāi) --> <code>xxxx</code> <!-- 指定機(jī)器啟動(dòng),機(jī)器碼 --> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>classFinal</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
啟動(dòng)方式
無(wú)密碼啟動(dòng)
java -javaagent:xxx-encrypted.jar -jar xxx-encrypted.jar
有密碼啟動(dòng)
java -javaagent:xxx-encrypted.jar='-pwd=密碼' -jar xxx-encrypted.jar
反編譯效果
啟動(dòng)包加密之后,方法體被清空,保留方法參數(shù)、注解等信息.主要兼容swagger文檔注解掃描
反編譯只能看到方法名和注解,看不到方法體的具體內(nèi)容
啟動(dòng)過(guò)程中解密class,完全內(nèi)存解密,不留下任何解密后的文件
yml配置文件留下空白
綁定機(jī)器啟動(dòng)
下載到 classfinal-fatjar-1.2.1.jar 依賴(lài),在當(dāng)前依賴(lài)下cmd執(zhí)行java -jar classfinal-fatjar-1.2.1.jar -C
命令,會(huì)自動(dòng)生成一串機(jī)器碼
將此生成好的機(jī)器碼,放到maven插件中的code里面即可。這樣,打包好的項(xiàng)目只能在生成機(jī)器碼的機(jī)器運(yùn)行,其他機(jī)器則啟動(dòng)不了項(xiàng)目。
以上就是SpringBoot項(xiàng)目防止反編譯的方案的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot防止反編譯的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java Clone深拷貝與淺拷貝的兩種實(shí)現(xiàn)方法
今天小編就為大家分享一篇關(guān)于Java Clone深拷貝與淺拷貝的兩種實(shí)現(xiàn)方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10從入門(mén)到精通:Java List遍歷修改的完全指南
在Java中,我們經(jīng)常需要遍歷List集合并對(duì)其中的元素進(jìn)行修改,這可以通過(guò)使用迭代器或for循環(huán)來(lái)實(shí)現(xiàn),需要的朋友可以參考下2023-10-10【面試】Spring事務(wù)面試考點(diǎn)吐血整理(建議珍藏)
本文是小編給大家收藏整理的Spring事務(wù)面試考點(diǎn),非常不錯(cuò),值得收藏,感興趣的朋友參考下吧2019-04-04如何在spring boot中進(jìn)行參數(shù)校驗(yàn)示例詳解
這篇文章主要介紹了如何在spring-boot中進(jìn)行參數(shù)校驗(yàn)及l(fā)ombok的使用詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05解決springboot配置文件組解決自動(dòng)配置屬性無(wú)法注入問(wèn)題
在使用Spring Boot時(shí),可能會(huì)遇到配置文件屬性注入失敗的問(wèn)題,本文描述了一個(gè)案例,其中嘗試使用profile文件組指定不同環(huán)境下的配置文件,但遇到了屬性無(wú)法成功注入的情況,提供的解決辦法是將Spring Boot的版本號(hào)從2.2.0.RELEASE升級(jí)到2.4.02024-09-09MyBatis圖文并茂講解注解開(kāi)發(fā)一對(duì)多查詢(xún)
這篇文章主要介紹了SpringBoot中Mybatis注解一對(duì)多查詢(xún)的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07Spring 靜態(tài)變量/構(gòu)造函數(shù)注入失敗的解決方案
我們經(jīng)常會(huì)遇到一下問(wèn)題:Spring對(duì)靜態(tài)變量的注入為空、在構(gòu)造函數(shù)中使用Spring容器中的Bean對(duì)象,得到的結(jié)果為空。不要擔(dān)心,本文將為大家介紹如何解決這些問(wèn)題,跟隨小編來(lái)看看吧2021-11-11Java實(shí)現(xiàn)從jar包中讀取指定文件的方法
這篇文章主要介紹了Java實(shí)現(xiàn)從jar包中讀取指定文件的方法,涉及java針對(duì)jar文件的讀取及查找相關(guān)操作技巧,需要的朋友可以參考下2017-08-08