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

Springboot集成Proguard生成混淆jar包方式

 更新時間:2024年11月21日 09:32:20   作者:胡八一、  
本文介紹了兩種Java代碼混淆工具:ClassFinal和ProGuard,ClassFinal是一個字節(jié)碼加密工具,但需要額外的加密包,使用復(fù)雜,ProGuard是一款開源的Java代碼混淆工具,可以有效地提高代碼的安全性,但對Spring框架的注解處理不夠完善

背景

當(dāng)我們需要將 JAR 包交付給第三方時,常常擔(dān)心代碼可能會被反編譯。因此,對 JAR 包進(jìn)行混淆處理顯得尤為重要。

市面上有許多 JAR 包源碼混淆工具,但真正能穩(wěn)定投入使用的并不多。例如,ClassFinal (ClassFinal: Java字節(jié)碼加密工具)`是國內(nèi)開發(fā)者開發(fā)的一款 JAR 包加密工具,它采用的是字節(jié)碼加密的方案。然而,ClassFinal (ClassFinal: Java字節(jié)碼加密工具)已經(jīng)停止維護(hù)多年,并且它的使用需要額外提供一個加密包來解密,這種方式雖然注重安全性,但增加了使用的復(fù)雜性。由于 JVM 的跨平臺特性,理想的工具應(yīng)該是簡潔、易于使用的,而不是增加額外的“掛件”來進(jìn)行保護(hù)。

另一款常用的工具是 ProGuard(GitHub - Guardsquare/proguard: ProGuard, Java optimizer and obfuscator),它是一款開源的 Java 代碼混淆工具。準(zhǔn)確來說是一個插件,不需要對他進(jìn)行編碼,只需要進(jìn)行配置即可。代碼混淆,并不是把所有代碼進(jìn)行混淆,這樣反而會出錯,比如枚舉類型如果也進(jìn)行混淆,那么在使用反射創(chuàng)建實例,并給實例賦值的時候,枚舉類型會反序列化失敗。ProGuard 的主要功能是在不影響程序功能的前提下,混淆 JAR 包內(nèi)的源碼,通過增加代碼的混亂程度,使得反編譯后的代碼可讀性大大降低,從而有效地提高了代碼的安全性。對于第三方來說,反編譯后的代碼難以理解,與其花費(fèi)大量時間研究,可能更傾向于重新開發(fā)實現(xiàn)。因此,從這個角度來看,ProGuard 確實可以滿足一定的代碼安全性需求。proguard提供了可以對哪些包,類,方法等不進(jìn)行混淆的配置,我們可以將枚舉配置在這里。

然而,需要注意的是,ProGuard 是一款通用的 Java 代碼混淆工具,并非針對 Spring 框架的專用工具。因此,它對 Spring 相關(guān)的注解并沒有特殊的處理。這意味著在使用 ProGuard 混淆 Spring Boot 應(yīng)用時,開發(fā)者可能需要進(jìn)行額外的配置和定制,這對不熟悉該工具的開發(fā)者來說增加了使用難度和成本。

實現(xiàn)流程

springboot提供了打包插件spring-boot-maven-plugin,所以我們的混淆需要在springboot打包的插件之前,就是我們要對混淆之后的代碼通過spring-boot-maven-plugin進(jìn)行打包。

Proguard核心內(nèi)容是兩個配置文件,一個pom.xml、一個proguard.cfg,這里提供最關(guān)鍵的兩個能夠直接使用的配置文件內(nèi)容,其余的配置相關(guān)描述可以通過文末的參考文獻(xiàn)獲取。

  • proguard.cfg配置示例
# 指定不警告尚未解決的引用和其他問題
-dontwarn
#指定Java的版本
-target 1.8
#proguard會對代碼進(jìn)行優(yōu)化壓縮,他會刪除從未使用的類或者類成員變量等(刪除注釋、未被引用代碼)
-dontshrink
#是否關(guān)閉字節(jié)碼級別的優(yōu)化,如果不開啟則設(shè)置如下配置  不做優(yōu)化(變更代碼實現(xiàn)邏輯)
-dontoptimize
#混淆時不生成大小寫混合的類名,默認(rèn)是可以大小寫混合
-dontusemixedcaseclassnames
# 不去忽略非公共的庫類
-dontskipnonpubliclibraryclasses
# 指定不跳過包可見的庫類成員(字段和方法)。
# 默認(rèn)情況下,proguard在解析庫類時會跳過包可見的庫類成員。當(dāng)我們確實引用了包可見的類成員時,需要設(shè)置此項
-dontskipnonpubliclibraryclassmembers
# 對于類成員的命名的混淆采取唯一策略
-useuniqueclassmembernames
# 優(yōu)化時允許訪問并修改有修飾符的類和類的成員
-allowaccessmodificatio
# 不混淆所有包名
#-keeppackagename
#混淆類名之后,對使用Class.forName('className')之類的地方進(jìn)行相應(yīng)替代
-adaptclassstrings
#保持目錄結(jié)構(gòu)
-keepdirectories
#對異常、注解信息予以保留
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod,Qualifier
# 此選項將保存接口中的所有原始名稱(不混淆)-->
#-keepnames interface ** { *; }

#混淆時是否記錄日志
#-verbose

# 此選項將保存所有軟件包中的所有原始接口文件(不進(jìn)行混淆)
#-keep interface * extends * { *; }

#保留參數(shù)名,因為控制器,或者M(jìn)ybatis等接口的參數(shù)如果混淆會導(dǎo)致無法接受參數(shù),xml文件找不到參數(shù)
-keepparameternames
# 保留枚舉成員及方法
#-keepclassmembers enum * { *; }
# 不混淆所有類,保存原始定義的注釋-
-keepclassmembers class * {
                        @org.springframework.context.annotation.Bean *;
                        @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 *;
                        @org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration *;
                        @org.springframework.boot.context.properties.ConfigurationProperties *;
                        @org.springframework.web.bind.annotation.RestController *;
                        @org.springframework.beans.factory.annotation.Qualifier *;
                        @io.swagger.annotations.ApiParam *;
                        @org.springframework.validation.annotation.Validated *;
                        @io.swagger.annotations.ApiModelProperty *;
                        @javax.validation.constraints.NotNull *;
                        @javax.validation.constraints.Size *;
                        @javax.validation.constraints.NotBlank *;
                        @javax.validation.constraints.Pattern *;

                        }
-keep class org.springframework.** {*;}
-keep public class ch.qos.logback.**{*;}
-keep class com.fasterxml.jackson.** { *; }

#忽略warn消息
-ignorewarnings
#打印配置信息
-printconfiguration

#入口程序類不能混淆,混淆會導(dǎo)致springboot啟動不了
-keep public class com.zhubayi.proguarddemo.ProguardDemoApplication { *;}

#mybatis的mapper/實體類不混淆,否則會導(dǎo)致xml配置的mapper找不到 ( 保持該目錄下所有類及其成員不被混淆)
#-keep class com.zhubayi.proguarddemo.mapper.** {*;}

# 實體類,枚舉方法不能混淆
#-keep class com.zhubayi.proguarddemo.enums.** {*;}
-keep class com.zhubayi.proguarddemo.entity.** {*;}
#controller不進(jìn)行混淆
-keep class com.zhubayi.proguarddemo.controller.** {*;}

# 保留特定框架或庫的類,注解類
#-keep class com.zhubayi.proguarddemo.elasticsearch.** { *; }
#-keep class com.zhubayi.proguarddemo.annotation.** {*;}

#還有一些配置類和Bean不能混淆 比如logPointCut   prefix 這些   @Pointcut  @ConfigurationProperties(prefix = "redisson")
#-keep class com.zhubayi.proguarddemo.aspectj.** {*;}

# 全放開
#-keep class com.ugdsec.** {*;}
#保留Serializable序列化的類不被混淆
# controller 層映射前臺參數(shù)的類、后端返回的 bean 屬性類等,不能混淆類的成員屬性(如變成 string a;)
-keepclassmembers  class * implements java.io.Serializable {*;}

# 不混淆所有的set/get方法
#-keepclassmembers public class * {void set*(***);*** get*();}
  • pom.xml配置示例 (注意:它必須要放到spring-boot-maven-plugin上面)
<build>
        <plugins>
            <plugin>
                <groupId>com.github.wvengen</groupId>
                <artifactId>proguard-maven-plugin</artifactId>
                <version>2.6.0</version>
                <executions>
                    <!-- 以下配置說明執(zhí)行mvn的package命令時候,會執(zhí)行proguard-->
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>proguard</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!-- 是否混淆 默認(rèn)是true -->
                    <obfuscate>true</obfuscate>
                    <!-- 防止本地編譯的時候路徑太長編譯失敗-->
                    <putLibraryJarsInTempDir>true</putLibraryJarsInTempDir>
                    <!-- 就是輸入Jar的名稱,我們要知道,代碼混淆其實是將一個原始的jar,生成一個混淆后的jar,那么就會有輸入輸出。 -->
                    <injar>${project.build.finalName}.jar</injar>
                    <!-- 輸出jar名稱,輸入輸出jar同名的時候就是覆蓋,也是比較常用的配置。 -->
                    <outjar>${project.build.finalName}.jar</outjar>
                    <!-- 配置一個文件,通常叫做proguard.cfg,該文件主要是配置options選項,也就是說使用proguard.cfg那么options下的所有內(nèi)容都可以移到proguard.cfg中 -->
                    <proguardInclude>${project.basedir}/proguard.cfg</proguardInclude>
                    <!-- 額外的jar包,通常是項目編譯所需要的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>-->
                    <!-- 這是輸出路徑配置,但是要注意這個路徑必須要包括injar標(biāo)簽填寫的jar -->
                    <outputDirectory>${project.basedir}/target</outputDirectory>
                    <!--這里特別重要,此處主要是配置混淆的一些細(xì)節(jié)選項,比如哪些類不需要混淆,哪些需要混淆-->
                    <options>
                        <!-- 可以在這里寫option標(biāo)簽配置,不過我上面使用了proguardInclude,所以可以在proguard.cfg中配置 -->
                        <!--JDK8-->
                        <!--<option>-target 1.8</option>-->
                        <!-- 不做收縮(刪除注釋、未被引用代碼)-->
                        <!--<option>-dontshrink</option>-->
                        <!-- 不做優(yōu)化(變更代碼實現(xiàn)邏輯)-->
                        <!--<option>-dontoptimize</option>-->
                        <!-- 不路過非公用類文件及成員-->
                        <!--<option>-dontskipnonpubliclibraryclasses</option>-->
                        <!--<option>-dontskipnonpubliclibraryclassmembers</option>-->
                        <!--不用大小寫混合類名機(jī)制-->
                        <!--<option>-dontusemixedcaseclassnames</option>-->
                    </options>
                    <!--子模塊-->
                    <assembly>
                        <inclusions>
                            <!--<inclusion>-->
                            <!--    <groupId>com.zhubayi</groupId>-->
                            <!--    <artifactId>chen-system</artifactId>-->
                            <!--</inclusion>-->
                        </inclusions>
                    </assembly>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>com.guardsquare</groupId>
                        <artifactId>proguard-base</artifactId>
                        <version>7.1.1</version>
                        <scope>runtime</scope>
                    </dependency>
                    <!--<dependency>-->
                    <!--    <groupId>com.guardsquare</groupId>-->
                    <!--    <artifactId>proguard-core</artifactId>-->
                    <!--    <version>7.1.1</version>-->
                    <!--    <scope>runtime</scope>-->
                    <!--</dependency>-->
                </dependencies>
            </plugin>
            <!--  proguard 代碼混淆配置  結(jié)束-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!-- 如果沒有該配置,devtools不會生效 -->
                    <fork>true</fork>
                    <mainClass>com.zhubayi.proguarddemo.ProguardDemoApplication</mainClass>
                    <!--<excludeGroupIds>com.zhubayi</excludeGroupIds>-->
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

注意:

<proguardInclude>${project.basedir}/proguard.cfg</proguardInclude>

${project.basedir}/proguard.cfg表示當(dāng)前項目的根目錄,所以需要把proguard.cfg放在當(dāng)前項目的根目錄

然后進(jìn)行打包

打包之后會多出三個文件

<!-- 就是輸入Jar的名稱,我們要知道,代碼混淆其實是將一個原始的jar,生成一個混淆后的jar,那么就會有輸入輸出。 -->
<injar>${project.build.finalName}.jar</injar>
  <!-- 輸出jar名稱,輸入輸出jar同名的時候就是覆蓋,也是比較常用的配置。 -->
<outjar>${project.build.finalName}.jar</outjar>

從pom打包配置可以得到,proguard-demo-0.0.1-SNAPSHOT.jar,就是項目混淆后的jar包。

proguard-demo-0.0.1-SNAPSHOT_proguard_base.jar就是正常的包,沒有進(jìn)行混淆。

反編譯查看

下載反編譯工具 jd-gui

打開然后選擇剛剛的混淆jar包

這里面對springboot相關(guān)的都進(jìn)行過過濾,所以剩下的都是和springboot無關(guān)的類, entity包、主啟動類和controller包配置沒有進(jìn)行混淆,所以還是原來的名字,其他都進(jìn)行了混淆,類名稱都直接縮寫成了小寫字母a,b,c…

啟動測試

D:\IdeaProjects\mytools\proguard-demo\target>java -jar proguard-demo-0.0.1-SNAPSHOT.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::       (v2.3.12.RELEASE)

2024-08-09 10:45:52.197  INFO 18600 --- [           main] c.z.p.ProguardDemoApplication            : Starting ProguardDemoApplication v0.0.1-SNAPSHOT on zhubayi-computer with PID 18600 (D:\IdeaProjects\mytools\proguard-demo\target\proguard-demo-0.0.1-SNAPSHOT.jar started by zhubayi in D:\IdeaProjects\mytools\proguard-demo\target)
2024-08-09 10:45:52.199  INFO 18600 --- [           main] c.z.p.ProguardDemoApplication            : No active profile set, falling back to default profiles: default
2024-08-09 10:45:53.664  INFO 18600 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2024-08-09 10:45:53.674  INFO 18600 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2024-08-09 10:45:53.675  INFO 18600 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.46]
2024-08-09 10:45:53.730  INFO 18600 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2024-08-09 10:45:53.730  INFO 18600 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1488 ms
2024-08-09 10:45:53.887  INFO 18600 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2024-08-09 10:45:54.028  INFO 18600 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2024-08-09 10:45:54.035  INFO 18600 --- [           main] c.z.p.ProguardDemoApplication            : Started ProguardDemoApplication in 2.143 seconds (JVM running for 2.561)

成功獲取到了數(shù)據(jù)。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 通過JDBC連接oracle數(shù)據(jù)庫的十大技巧

    通過JDBC連接oracle數(shù)據(jù)庫的十大技巧

    通過JDBC連接oracle數(shù)據(jù)庫的十大技巧...
    2006-12-12
  • Java三種求水仙花數(shù)的方法

    Java三種求水仙花數(shù)的方法

    本篇文章通過求水仙花數(shù)的實例來讓大家對JAVA求數(shù)的概念和方法有更深入的理解和應(yīng)用,學(xué)習(xí)參考下吧。
    2018-02-02
  • AntDesign封裝全局異常處理全局?jǐn)r截器

    AntDesign封裝全局異常處理全局?jǐn)r截器

    這篇文章主要為大家介紹了AntDesign封裝全局異常處理全局?jǐn)r截器,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Java接入支付寶授權(quán)第三方登錄的完整步驟

    Java接入支付寶授權(quán)第三方登錄的完整步驟

    不管是支付寶支付,還是微信支付,還是銀聯(lián)支付等,大部分的支付流程都是相似的,這篇文章主要給大家介紹了關(guān)于Java接入支付寶授權(quán)第三方登錄的相關(guān)資料,使用支付寶的沙盒環(huán)境示例,需要的朋友可以參考下
    2021-07-07
  • Data Source與數(shù)據(jù)庫連接池簡介(JDBC簡介)

    Data Source與數(shù)據(jù)庫連接池簡介(JDBC簡介)

    DataSource是作為DriverManager的替代品而推出的,DataSource 對象是獲取連接的首選方法,這篇文章主要介紹了Data Source與數(shù)據(jù)庫連接池簡介(JDBC簡介),需要的朋友可以參考下
    2022-11-11
  • Spring AOP使用接口方式實現(xiàn)

    Spring AOP使用接口方式實現(xiàn)

    本文主要介紹了Spring AOP使用接口方式實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Spring Cloud中使用Eureka的詳細(xì)過程

    Spring Cloud中使用Eureka的詳細(xì)過程

    Eureka 是 Netflix 開源的一個服務(wù)發(fā)現(xiàn)組件,它在微服務(wù)架構(gòu)中扮演著重要的角色,這篇文章主要介紹了Spring Cloud中如何使用Eureka,需要的朋友可以參考下
    2024-07-07
  • java編程是做什么的

    java編程是做什么的

    在本篇文章里小編給大家整理的是一篇關(guān)于java編程是什么相關(guān)的基礎(chǔ)知識點(diǎn)內(nèi)容,有興趣的朋友們可以閱讀下。
    2021-01-01
  • SpringBoot實現(xiàn)類似鉤子函數(shù)的方法

    SpringBoot實現(xiàn)類似鉤子函數(shù)的方法

    這篇文章主要給大家介紹了關(guān)于SpringBoot實現(xiàn)類似鉤子函數(shù)的方法,文中通過代碼示例介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-04-04
  • java代碼實現(xiàn)雙向鏈表

    java代碼實現(xiàn)雙向鏈表

    這篇文章主要為大家詳細(xì)介紹了java代碼實現(xiàn)雙向鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評論