使用springboot防止反編譯proguard+xjar
一、背景
項(xiàng)目組核心代碼模塊部署于用戶服務(wù)器上,直接甩jar包到服務(wù)器的方式,極有可能導(dǎo)致數(shù)據(jù)泄露和代碼泄露,為了防止有技術(shù)能力的用戶反編譯我們的程序,采用了proguard和xjar兩種方式來(lái)混淆和加密jar包,注:加密技術(shù)只是提高別人獲取你的代碼的門(mén)檻,沒(méi)有絕對(duì)安全的加密方式,而安全等級(jí)越高,程序開(kāi)發(fā)、運(yùn)維、部署的成本就越高,所以,合適的加密技術(shù)就是最好的。
二、簡(jiǎn)介
1. ProGuard是一個(gè)壓縮、優(yōu)化和混淆Java字節(jié)碼文件的免費(fèi)的工具
它可以刪除無(wú)用的類、字段、方法和屬性??梢詣h除沒(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í)不生成大小寫(xiě)混合的類名,默認(rèn)是可以大小寫(xiě)混合 -dontusemixedcaseclassnames # 對(duì)于類成員的命名的混淆采取唯一策略 -useuniqueclassmembernames #混淆時(shí)不生成大小寫(xiě)混合的類名,默認(rèn)是可以大小寫(xiě)混合 -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[]); }
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)簽填寫(xiě)的jar --> <outputDirectory>${project.basedir}/target</outputDirectory> <!--這里特別重要,此處主要是配置混淆的一些細(xì)節(jié)選項(xiàng),比如哪些類不需要混淆,哪些需要混淆--> <options> <!-- 可以在此處寫(xiě)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í)不生成大小寫(xiě)混合的類名,默認(rèn)是可以大小寫(xiě)混合 -dontusemixedcaseclassnames # 對(duì)于類成員的命名的混淆采取唯一策略 -useuniqueclassmembernames #混淆時(shí)不生成大小寫(xiě)混合的類名,默認(rèn)是可以大小寫(xiě)混合 -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)簽填寫(xiě)的jar --> <outputDirectory>${project.basedir}/target</outputDirectory> <!--這里特別重要,此處主要是配置混淆的一些細(xì)節(jié)選項(xiàng),比如哪些類不需要混淆,哪些需要混淆--> <options> <!-- 可以在此處寫(xiě)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-10JAVA?從完整的文件路徑中分別截取文件名和文件路徑的實(shí)現(xiàn)
在Java編程中,經(jīng)常會(huì)遇到需要截取文件名的場(chǎng)景,本文主要介紹了JAVA?從完整的文件路徑中分別截取文件名和文件路徑的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04Filter中獲取傳遞參數(shù)方式(解決post請(qǐng)求參數(shù)問(wèn)題)
這篇文章主要介紹了Filter中獲取傳遞參數(shù)方式(解決post請(qǐng)求參數(shù)問(wèn)題),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08java不用循環(huán)語(yǔ)句打印數(shù)組元素的實(shí)例
下面小編就為大家?guī)?lái)一篇java不用循環(huán)語(yǔ)句打印數(shù)組元素的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03Java實(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-03idea中創(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