使用springboot防止反編譯proguard+xjar
一、背景
項(xiàng)目組核心代碼模塊部署于用戶服務(wù)器上,直接甩jar包到服務(wù)器的方式,極有可能導(dǎo)致數(shù)據(jù)泄露和代碼泄露,為了防止有技術(shù)能力的用戶反編譯我們的程序,采用了proguard和xjar兩種方式來(lái)混淆和加密jar包,注:加密技術(shù)只是提高別人獲取你的代碼的門檻,沒(méi)有絕對(duì)安全的加密方式,而安全等級(jí)越高,程序開(kāi)發(fā)、運(yùn)維、部署的成本就越高,所以,合適的加密技術(shù)就是最好的。
二、簡(jiǎn)介
1. ProGuard是一個(gè)壓縮、優(yōu)化和混淆Java字節(jié)碼文件的免費(fèi)的工具
它可以刪除無(wú)用的類、字段、方法和屬性。可以刪除沒(méi)用的注釋,最大限度地優(yōu)化字節(jié)碼文件。
它還可以使用簡(jiǎn)短的無(wú)意義的名稱來(lái)重命名已經(jīng)存在的類、字段、方法和屬性。常常用于Android開(kāi)發(fā)用于混淆最終的項(xiàng)目,增加項(xiàng)目被反編譯的難度。
2. Xjar
- Spring Boot JAR 安全加密運(yùn)行工具, 同時(shí)支持的原生JAR
- 基于對(duì)JAR包內(nèi)資源的加密以及拓展ClassLoader來(lái)構(gòu)建的一套程序加密啟動(dòng), 動(dòng)態(tài)解密運(yùn)行的方案, 避免源碼泄露以及反編譯.
功能特性:
- 無(wú)代碼侵入, 只需要把編譯好的JAR包通過(guò)工具加密即可.
- 完全內(nèi)存解密, 降低源碼以及字節(jié)碼泄露或反編譯的風(fēng)險(xiǎn).
- 支持所有JDK內(nèi)置加解密算法.
- 可選擇需要加解密的字節(jié)碼或其他資源文件.
- 支持Maven插件, 加密更加便捷.
- 動(dòng)態(tài)生成Go啟動(dòng)器, 保護(hù)密碼不泄露.
3.ClassFinal是一款Java class文件安全加密工具
支持直接加密jar包或war包,無(wú)需修改任何項(xiàng)目代碼,兼容spring-framework,可避免源碼泄漏或字節(jié)碼被反編譯,
功能特性:
- 無(wú)需修改原項(xiàng)目代碼,只要把編譯好的jar/war包用本工具加密即可。
- 運(yùn)行加密項(xiàng)目時(shí),無(wú)需求修改tomcat,spring等源代碼。
- 支持普通jar包、springboot jar包以及普通java web項(xiàng)目編譯的war包。
- 支持spring framework、swagger等需要在啟動(dòng)過(guò)程中掃描注解或生成字節(jié)碼的框架。
- 支持maven插件,添加插件后在打包過(guò)程中自動(dòng)加密。
- 支持加密WEB-INF/lib或BOOT-INF/lib下的依賴jar包。
三、預(yù)研了classfinal
classfinal其實(shí)也可以起到代碼加密的效果,功能也很強(qiáng)大,被classfinal加密過(guò)后的jar包,反編譯了以后,方法返回值會(huì)return null或者0,方法內(nèi)部會(huì)自動(dòng)去掉。
并且用classfinal加密過(guò)后的jar包啟動(dòng)方式需要用javaagnet啟動(dòng)。
而相比較xjar,反編譯以后,反編譯后,直接顯示Internal Error.
1.module pom文件引入
<plugin>
<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)密碼 -->
<packages>com.nick.gnss</packages><!-- 加密的包名,多個(gè)包用逗號(hào)分開(kāi)-->
<excludes>org.spring</excludes>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>classFinal</goal>
</goals>
</execution>
</executions>
</plugin>2.啟動(dòng)方式
1)無(wú)密碼啟動(dòng)
java -jar gnss-server-1.0.0-encrypted.jar
2)有密碼啟動(dòng)
java -javaagent:gnss-server-1.0.0-encrypted.jar="-pwd 123456" -jar gnss-server-1.0.0-encrypted.jar
3.反編譯后的效果
所有的方法,return 0 或者 null. 方法體內(nèi)部是空的。

四、引入proguard混淆
1.module中增加proguard.cfg文件
#指定Java的版本
-target 1.8
#proguard會(huì)對(duì)代碼進(jìn)行優(yōu)化壓縮,他會(huì)刪除從未使用的類或者類成員變量等
-dontshrink
#是否關(guān)閉字節(jié)碼級(jí)別的優(yōu)化,如果不開(kāi)啟則設(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)致無(wú)法接受參數(shù),xml文件找不到參數(shù)
-keepparameternames
# 保留枚舉成員及方法
-keepclassmembers enum * { *; }
# 不混淆所有的set/get方法
-keepclassmembers public class * {void set*(***);*** get*();}
# 不混淆所有包含Component等注解的類
-keep @org.springframework.context.annotation.Bean class * {*;}
-keep @org.springframework.context.beans.factory.annotation.Autowired class * {*;}
-keep @org.springframework.context.beans.factory.annotation.Value class * {*;}
-keep @org.springframework.stereotype.Service class * {*;}
-keep @org.springframework.stereotype.Component class * {*;}
-keep @org.springframework.web.bind.annotation.RestController class * {*;}
-keep @org.springframework.context.annotation.Configuration class * {*;}
#忽略warn消息
-ignorewarnings
#忽略note消息
-dontnote
#打印配置信息
-printconfiguration
#啟動(dòng)類不需要混淆
-keep class com.nick.GnssApplication {
public static void main(java.lang.String[]);
}2.module pom文件引入
此處需要注意,proguard plugin需要放在repackage plugin之前,否則混淆沒(méi)有效果。原理就是在打包之前將代碼混淆,然后再打包。
<!--代碼混淆proguard-->
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.6.0</version>
<executions>
<!-- 以下配置說(shuō)明執(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),也就是說(shuō)使用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)行過(guò)濾比如,如下配置就是對(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)簽配置,不過(guò)我上面使用了proguardInclude,故而我更喜歡在proguard.cfg中配置 -->
</options>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<configuration>
<mainClass>com.nick.GnssApplication</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>3.反編譯看效果
查看xxx.jar是否有混淆的效果,而不是xxx_proguard_base.jar(此jar是沒(méi)有混淆的原jar)

效果杠杠滴!?。⌒枰囘\(yùn)行,并且注意配置proguard,否則會(huì)導(dǎo)致程序運(yùn)行異常,這可能就是proguard的唯一缺點(diǎn)了吧,歡迎拍磚。。。

4.運(yùn)行查看效果
啟動(dòng)成功,沒(méi)毛病

五、引入xjar
1.parent pom文件引入
重點(diǎn)在最下面的xjar plugin
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.nick</groupId>
<artifactId>nick-server</artifactId>
<version>1.0.0</version>
<name>nick-server</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
</properties>
<modules>
<module>gnss-server</module>
</modules>
<packaging>pom</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!--代碼加密-->
<plugin>
<groupId>com.github.core-lib</groupId>
<artifactId>xjar-maven-plugin</artifactId>
<version>v2.0.7</version>
<executions>
<execution>
<goals>
<goal>build</goal>
</goals>
<phase>package</phase>
<configuration>
<password>44889951235894612351265ABD123</password>
<mode>1</mode>
<sourceDir>${project.build.directory}</sourceDir>
<targetJar>${project.build.finalName}_x.jar</targetJar>
<includes>
<include>com/nick/**</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>2. module pom文件引入
需要放在module pom文件plugin 最后一個(gè),保證xjar是最后一個(gè)執(zhí)行plugin
<!--代碼加密xjar-->
<plugin>
<groupId>com.github.core-lib</groupId>
<artifactId>xjar-maven-plugin</artifactId>
</plugin>3.編譯打包

4.反編譯看效果
效果杠杠滴

5.運(yùn)行查看效果

六、proguard + xjar
將第四步和第五步融合即可,但是要注意pom文件中的plugin的先后問(wèn)題,不然要么混淆失敗,要么加密失敗。
1.完整版的parent pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.nick</groupId>
<artifactId>nick-server</artifactId>
<version>1.0.0</version>
<name>nick-server</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
</properties>
<modules>
<module>gnss-server</module>
</modules>
<packaging>pom</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!--代碼加密-->
<plugin>
<groupId>com.github.core-lib</groupId>
<artifactId>xjar-maven-plugin</artifactId>
<version>v2.0.7</version>
<executions>
<execution>
<goals>
<goal>build</goal>
</goals>
<phase>package</phase>
<configuration>
<password>44889951235894612351265ABD123</password>
<mode>1</mode>
<sourceDir>${project.build.directory}</sourceDir>
<targetJar>${project.build.finalName}_x.jar</targetJar>
<includes>
<include>com/nick/**</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>2.完整版的poguard.cfg
#指定Java的版本
-target 1.8
#proguard會(huì)對(duì)代碼進(jìn)行優(yōu)化壓縮,他會(huì)刪除從未使用的類或者類成員變量等
-dontshrink
#是否關(guān)閉字節(jié)碼級(jí)別的優(yōu)化,如果不開(kāi)啟則設(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)榭刂破?,或者M(jìn)ybatis等接口的參數(shù)如果混淆會(huì)導(dǎo)致無(wú)法接受參數(shù),xml文件找不到參數(shù)
-keepparameternames
# 保留枚舉成員及方法
-keepclassmembers enum * { *; }
# 不混淆所有的set/get方法
-keepclassmembers public class * {void set*(***);*** get*();}
# 不混淆所有包含Component等注解的類
-keep @org.springframework.context.annotation.Bean class * {*;}
-keep @org.springframework.context.beans.factory.annotation.Autowired class * {*;}
-keep @org.springframework.context.beans.factory.annotation.Value class * {*;}
-keep @org.springframework.stereotype.Service class * {*;}
-keep @org.springframework.stereotype.Component class * {*;}
-keep @org.springframework.web.bind.annotation.RestController class * {*;}
-keep @org.springframework.context.annotation.Configuration class * {*;}
#忽略warn消息
-ignorewarnings
#忽略note消息
-dontnote
#打印配置信息
-printconfiguration
#啟動(dòng)類不需要混淆
-keep class com.nick.GnssApplication {
public static void main(java.lang.String[]);
}3.完整版的module pom文件
該pom文件中注意兩點(diǎn)
- 1)引入parent節(jié)點(diǎn)
- 2)需要放在最后一個(gè)plugin執(zhí)行
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>nick-server</artifactId>
<groupId>com.nick</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.nick</groupId>
<artifactId>gnss-server</artifactId>
<version>1.0.0</version>
<name>gnss-server</name>
<description>gnss-server</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
<!--maven.build.timestamp保存了maven編譯時(shí)間戳-->
<!--在Maven 3.2.2+中, maven.build.timestamp已被重新定義,顯示UTC中的時(shí)間,比中國(guó)時(shí)間慢8個(gè)小時(shí)-->
<timestamp>${maven.build.timestamp}</timestamp>
<!--指定時(shí)間格式-->
<maven.build.timestamp.format>yyyy-MM-dd HH:mm:ss</maven.build.timestamp.format>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<!--1.2.80以下存在安全漏洞-->
<!--<version>1.2.78</version>-->
<version>1.2.83</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>30.1.1-jre</version>
</dependency>
<!--nacos-web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<delimiters>
<delimiter>@</delimiter>
</delimiters>
<useDefaultDelimiters>false</useDefaultDelimiters>
</configuration>
</plugin>
<!--代碼混淆proguard-->
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.6.0</version>
<executions>
<!-- 以下配置說(shuō)明執(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),也就是說(shuō)使用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)行過(guò)濾比如,如下配置就是對(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)簽配置,不過(guò)我上面使用了proguardInclude,故而我更喜歡在proguard.cfg中配置 -->
</options>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<configuration>
<mainClass>com.nick.GnssApplication</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<!--代碼加密xjar-->
<plugin>
<groupId>com.github.core-lib</groupId>
<artifactId>xjar-maven-plugin</artifactId>
</plugin>
<!--classfinal加密程序-->
<!--<plugin>-->
<!--<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)密碼 –>-->
<!--<packages>com.nick.gnss</packages><!– 加密的包名,多個(gè)包用逗號(hào)分開(kāi)–>-->
<!--<excludes>org.spring</excludes>-->
<!--</configuration>-->
<!--<executions>-->
<!--<execution>-->
<!--<phase>package</phase>-->
<!--<goals>-->
<!--<goal>classFinal</goal>-->
<!--</goals>-->
<!--</execution>-->
<!--</executions>-->
<!--</plugin>-->
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>4.打包編譯

5.反編譯查看效果

OK, 效果杠杠滴,混淆+加密。
至此,混淆+加密搞定。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Maven Spring jar包啟動(dòng)報(bào)錯(cuò)問(wèn)題解決方案
maven 編譯jar包,放在linux服務(wù)器啟動(dòng)不起來(lái),提示:xxxx-0.0.1-SNAPSHOT.jar中沒(méi)有主清單屬性,接下來(lái)通過(guò)本文給大家分享問(wèn)題原因及解決方案,感興趣的朋友跟隨小編一起看看吧2023-10-10
JAVA?從完整的文件路徑中分別截取文件名和文件路徑的實(shí)現(xiàn)
在Java編程中,經(jīng)常會(huì)遇到需要截取文件名的場(chǎng)景,本文主要介紹了JAVA?從完整的文件路徑中分別截取文件名和文件路徑的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04
Filter中獲取傳遞參數(shù)方式(解決post請(qǐng)求參數(shù)問(wèn)題)
這篇文章主要介紹了Filter中獲取傳遞參數(shù)方式(解決post請(qǐng)求參數(shù)問(wèn)題),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
java不用循環(huán)語(yǔ)句打印數(shù)組元素的實(shí)例
下面小編就為大家?guī)?lái)一篇java不用循環(huán)語(yǔ)句打印數(shù)組元素的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
Java實(shí)現(xiàn)PDF轉(zhuǎn)HTML/Word/Excel/PPT/PNG的示例代碼
這篇文章主要為大家介紹了如何利用Java語(yǔ)言是PDF轉(zhuǎn)HTML、Word、Excel、PPT和PNG功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-05-05
通過(guò)實(shí)例學(xué)習(xí)Spring @Required注釋原理
這篇文章主要介紹了通過(guò)實(shí)例學(xué)習(xí)Spring @Required注釋原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
idea中創(chuàng)建jsp項(xiàng)目的詳細(xì)實(shí)戰(zhàn)步驟
才學(xué)javaWeb,以防自己忘記創(chuàng)建項(xiàng)目的過(guò)程,所以淺淺的記錄一下吧,下面這篇文章主要給大家介紹了關(guān)于idea中創(chuàng)建jsp項(xiàng)目的詳細(xì)步驟,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09

