Springboot打包代碼,反編譯后代碼混淆方式(防止還原代碼)
前言
在我們寫完springboot程序后,打完jar包,放置服務(wù)器進(jìn)行部署,若有人將服務(wù)器上jar包拉取下來,進(jìn)行反編譯,是可以還原代碼的,那么我們有沒有比較好的方法、方案或者措施不讓反編譯還原原始代碼呢,今天我們一起研究、探討一下jar包混淆。
一、 什么是編譯
就是把代碼跑一下,然后我們的代碼 .java文件 就被編譯成了 .class 文件。
二、什么是反編譯
針對編譯生成的 jar/war 包 里面的 .class 文件 逆向還原回來,可以看到你的原始代碼。
比較常用的反編譯工具 JD-GUI ,直接把編譯好的jar丟進(jìn)去,大部分都能反編譯看到源碼:
三、混淆反編譯后原始代碼
代碼混淆 ,是其中一種手段。
第一步, 在項(xiàng)目路徑下,新增一份文件 proguard.cfg :
- proguard.cfg
#指定Java的版本 -target 1.8 #proguard會對代碼進(jìn)行優(yōu)化壓縮,他會刪除從未使用的類或者類成員變量等 -dontshrink #是否關(guān)閉字節(jié)碼級別的優(yōu)化,如果不開啟則設(shè)置如下配置 -dontoptimize #混淆時(shí)不生成大小寫混合的類名,默認(rèn)是可以大小寫混合 -dontusemixedcaseclassnames # 對于類成員的命名的混淆采取唯一策略 -useuniqueclassmembernames #混淆時(shí)不生成大小寫混合的類名,默認(rèn)是可以大小寫混合 -dontusemixedcaseclassnames #混淆類名之后,對使用Class.forName('className')之類的地方進(jìn)行相應(yīng)替代 -adaptclassstrings #對異常、注解信息予以保留 -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod # 此選項(xiàng)將保存接口中的所有原始名稱(不混淆)--> -keepnames interface ** { *; } # 此選項(xiàng)將保存所有軟件包中的所有原始接口文件(不進(jìn)行混淆) #-keep interface * extends * { *; } #保留參數(shù)名,因?yàn)榭刂破鳎蛘進(jìn)ybatis等接口的參數(shù)如果混淆會導(dǎo)致無法接受參數(shù),xml文件找不到參數(shù) -keepparameternames # 保留枚舉成員及方法 -keepclassmembers enum * { *; } # 不混淆所有類,保存原始定義的注釋- -keepclassmembers class * { @org.springframework.context.annotation.Bean *; @org.springframework.beans.factory.annotation.Autowired *; @org.springframework.beans.factory.annotation.Value *; @org.springframework.stereotype.Service *; @org.springframework.stereotype.Component *; } #忽略warn消息 -ignorewarnings #忽略note消息 -dontnote #打印配置信息 -printconfiguration -keep public class com.example.myproguarddemo.MyproguarddemoApplication { public static void main(java.lang.String[]); }
第二步,在pom文件上 加入proguard 混淆插件
- build標(biāo)簽里面改動加入一下配置
<build> <plugins> <plugin> <groupId>com.github.wvengen</groupId> <artifactId>proguard-maven-plugin</artifactId> <version>2.6.0</version> <executions> <!-- 以下配置說明執(zhí)行mvn的package命令時(shí)候,會執(zhí)行proguard--> <execution> <phase>package</phase> <goals> <goal>proguard</goal> </goals> </execution> </executions> <configuration> <!-- 就是輸入Jar的名稱,我們要知道,代碼混淆其實(shí)是將一個(gè)原始的jar,生成一個(gè)混淆后的jar,那么就會有輸入輸出。 --> <injar>${project.build.finalName}.jar</injar> <!-- 輸出jar名稱,輸入輸出jar同名的時(shí)候就是覆蓋,也是比較常用的配置。 --> <outjar>${project.build.finalName}.jar</outjar> <!-- 是否混淆 默認(rèn)是true --> <obfuscate>true</obfuscate> <!-- 配置一個(gè)文件,通常叫做proguard.cfg,該文件主要是配置options選項(xiàng),也就是說使用proguard.cfg那么options下的所有內(nèi)容都可以移到proguard.cfg中 --> <proguardInclude>${project.basedir}/proguard.cfg</proguardInclude> <!-- 額外的jar包,通常是項(xiàng)目編譯所需要的jar --> <libs> <lib>${java.home}/lib/rt.jar</lib> <lib>${java.home}/lib/jce.jar</lib> <lib>${java.home}/lib/jsse.jar</lib> </libs> <!-- 對輸入jar進(jìn)行過濾比如,如下配置就是對META-INFO文件不處理。 --> <inLibsFilter>!META-INF/**,!META-INF/versions/9/**.class</inLibsFilter> <!-- 這是輸出路徑配置,但是要注意這個(gè)路徑必須要包括injar標(biāo)簽填寫的jar --> <outputDirectory>${project.basedir}/target</outputDirectory> <!--這里特別重要,此處主要是配置混淆的一些細(xì)節(jié)選項(xiàng),比如哪些類不需要混淆,哪些需要混淆--> <options> <!-- 可以在此處寫option標(biāo)簽配置,不過我上面使用了proguardInclude,故而我更喜歡在proguard.cfg中配置 --> </options> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> <configuration> <mainClass>com.example.myproguarddemo.MyproguarddemoApplication</mainClass> </configuration> </execution> </executions> </plugin> </plugins> </build>
然后點(diǎn)擊package,正常執(zhí)行編譯打包流程就可以 :
**然后可以看到j(luò)ar的生成: **
看看效果:
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Boot高級教程之使用Redis實(shí)現(xiàn)session共享
這篇文章主要為大家詳細(xì)介紹了Spring Boot高級教程之使用Redis實(shí)現(xiàn)session共享,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10Springboot?maven項(xiàng)目配置文件覆蓋問題的處理
這篇文章主要介紹了Springboot?maven項(xiàng)目配置文件覆蓋問題的處理方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05解決MybatisPlus批量插入數(shù)據(jù)報(bào)錯(cuò):Error getting generated 
在使用MybatisPlus進(jìn)行批量插入數(shù)據(jù)時(shí)遇到空指針異常錯(cuò)誤,分析原因是由于主鍵生成策略導(dǎo)致的,嘗試通過設(shè)置useGeneratedKeys屬性解決問題,但因批量插入方法限制,該方法未能成功,最終通過自定義mapper方法實(shí)現(xiàn)批量插入,解決了問題2024-09-09Spring Boot/Angular整合Keycloak實(shí)現(xiàn)單點(diǎn)登錄功能
Keycloak新的發(fā)行版命名為Quarkus,專為GraalVM和OpenJDK HotSpot量身定制的一個(gè)Kurbernetes Native Java框架,計(jì)劃2019年底正式發(fā)布。這篇文章主要介紹了Spring Boot/Angular整合Keycloak實(shí)現(xiàn)單點(diǎn)登錄,需要的朋友可以參考下2019-10-10JavaMap兩種遍歷方式keySet與entrySet詳解
這篇文章主要介紹了JavaMap兩種遍歷方式keySet與entrySet,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-03-03詳解Java Bellman-Ford算法原理及實(shí)現(xiàn)
Bellman-Ford算法與Dijkstra算法類似,都是以松弛操作作為基礎(chǔ),Bellman-Ford算法是對所有邊都進(jìn)行松弛操作,本文將詳解Bellman-Ford算法原理及實(shí)現(xiàn),感興趣的可以了解一下2022-07-07