欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用springboot防止反編譯proguard+xjar

 更新時(shí)間:2024年11月21日 10:13:10   作者:mawei7510  
介紹了三種代碼混淆和加密工具的使用方法:ProGuard、Xjar和ClassFinal,ProGuard用于混淆Java字節(jié)碼,Xjar提供對(duì)JAR包內(nèi)資源的加密和動(dòng)態(tài)解密,而ClassFinal則支持直接加密JAR包或WAR包,通過(guò)預(yù)研和實(shí)際操作

一、背景

項(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>&lt;!&ndash; #表示啟動(dòng)時(shí)不需要密碼,事實(shí)上對(duì)于代碼混淆來(lái)說(shuō),這個(gè)密碼沒(méi)什么用,它只是一個(gè)啟動(dòng)密碼 &ndash;&gt;-->
            <!--<packages>com.nick.gnss</packages>&lt;!&ndash; 加密的包名,多個(gè)包用逗號(hào)分開(kāi)&ndash;&gt;-->
            <!--<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)文章

最新評(píng)論