SpringBoot 代碼混淆真香,再也不用擔(dān)心反編譯代碼泄露...
大家好,我是寶哥 !
編譯
簡單就是把代碼跑一哈,然后我們的代碼 .java文件 就被編譯成了 .class 文件

反編譯
就是針對(duì)編譯生成的 jar/war 包 里面的 .class 文件 逆向還原回來,可以看到你的代碼寫的啥。
比較常用的反編譯工具 JD-GUI ,直接把編譯好的jar丟進(jìn)去,大部分都能反編譯看到源碼:

那如果不想給別人反編譯看自己寫的代碼呢?
怎么做?
混淆
該篇玩的代碼混淆 ,是其中一種手段。
我給你看,但你反編譯看到的不是真正的代碼。
先看一張效果示例圖 :

開搞
正文
先看一下我們混淆一個(gè)項(xiàng)目代碼,要做啥?

一共就兩步
第一步, 在項(xiàng)目路徑下,新增一份文件 proguard.cfg :
proguard.cfg
#指定Java的版本
-target?1.8
#proguard會(huì)對(duì)代碼進(jìn)行優(yōu)化壓縮,他會(huì)刪除從未使用的類或者類成員變量等
-dontshrink
#是否關(guān)閉字節(jié)碼級(jí)別的優(yōu)化,如果不開啟則設(shè)置如下配置
-dontoptimize
#混淆時(shí)不生成大小寫混合的類名,默認(rèn)是可以大小寫混合
-dontusemixedcaseclassnames
#?對(duì)于類成員的命名的混淆采取唯一策略
-useuniqueclassmembernames
#混淆時(shí)不生成大小寫混合的類名,默認(rèn)是可以大小寫混合
-dontusemixedcaseclassnames
#混淆類名之后,對(duì)使用Class.forName('className')之類的地方進(jìn)行相應(yīng)替代
-adaptclassstrings
?
#對(duì)異常、注解信息予以保留
-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ù)如果混淆會(huì)導(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?*;
[email protected]?*;
????????????????????????@org.springframework.stereotype.Component?*;
????????????????????????}
?
#忽略warn消息
-ignorewarnings
#忽略note消息
-dontnote
#打印配置信息
-printconfiguration
-keep?public?class?com.example.myproguarddemo.MyproguarddemoApplication?{
????????public?static?void?main(java.lang.String[]);
????}
注意點(diǎn):

其余的看注釋,可以配置哪些類不參與混淆,哪些枚舉保留,哪些方法名不混淆等等。
第二步,在pom文件上 加入proguard 混淆插件 :
build標(biāo)簽里面改動(dòng)加入一下配置
<build>
????<plugins>
????????<plugin>
????????????<groupId>com.github.wvengen</groupId>
????????????<artifactId>proguard-maven-plugin</artifactId>
????????????<version>2.6.0</version>
????????????<executions>
????????????????<!--?以下配置說明執(zhí)行mvn的package命令時(shí)候,會(huì)執(zhí)行proguard-->
????????????????<execution>
????????????????????<phase>package</phase>
????????????????????<goals>
????????????????????????<goal>proguard</goal>
????????????????????</goals>
????????????????</execution>
????????????</executions>
????????????<configuration>
????????????????<!--?就是輸入Jar的名稱,我們要知道,代碼混淆其實(shí)是將一個(gè)原始的jar,生成一個(gè)混淆后的jar,那么就會(huì)有輸入輸出。?-->
????????????????<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>
????????????????<!--?對(duì)輸入jar進(jìn)行過濾比如,如下配置就是對(duì)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):


然后可以看到:

然后點(diǎn)擊package,正常執(zhí)行編譯打包流程就可以 :

然后可以看到j(luò)ar的生成:

看看效果:

好了,該篇就到這。
來源:https://blog.csdn.net/qq_35387940
精彩推薦:
公司系統(tǒng)太多,能不能實(shí)現(xiàn)賬號(hào)互通?
這是我見過最好的流程引擎架構(gòu)設(shè)計(jì)!
SpringBoot+@Async注解一起用,速度提升100倍!
