[Java]基于Maven的SpringWeb项目下使用proguard对class进行混淆的配置

2022-11-02 617点热度 0人点赞 0条评论

需求说明

IDEA下需要对一个普通的SpringWeb项目(使用的是Maven构建)的编译出来的class文件进行混淆,准备使用proguard来进行。

实现

我找到了一个使用proguard的maven编译插件,项目地址是:https://github.com/wvengen/proguard-maven-plugin

首先修改pom.xml,在project下,使用如下内容(配置文件有注释,可根据自己实际情况做调整):

<build>
<plugins>
<!-- ProGuard混淆插件-->
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.5.3</version>
<executions>
<execution>
<!-- 混淆时刻,这里是打包的时候混淆-->
<phase>package</phase>
<goals>
<!-- 使用插件的什么功能,当然是混淆-->
<goal>proguard</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 是否将生成的PG文件安装部署-->
<attach>true</attach>
<!-- 是否混淆-->
<obfuscate>true</obfuscate>
<!-- 指定生成文件分类 -->
<attachArtifactClassifier>pg</attachArtifactClassifier>
<options>
</options>
<outjar>${project.build.finalName}-pg.jar</outjar>
<!-- 添加依赖,这里你可以按你的需要修改,这里测试只需要一个JRE的Runtime包就行了 -->
<libs>
<!-- ${java.home}/jre/lib/rt.jar-->
<lib>/Users/User/Library/Java/JavaVirtualMachines/amazon-corretto-8.jdk/Contents/Home/jre/lib/rt.jar</lib>
</libs>
<!-- 加载文件的过滤器,就是你的工程目录了-->
<!-- <inFilter>com/example/test/shiro_spring/**</inFilter>-->
<injar>classes</injar>
<!-- 输出目录-->
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
</plugin>
</plugins>
</build>
<build> <plugins> <!-- ProGuard混淆插件--> <plugin> <groupId>com.github.wvengen</groupId> <artifactId>proguard-maven-plugin</artifactId> <version>2.5.3</version> <executions> <execution> <!-- 混淆时刻,这里是打包的时候混淆--> <phase>package</phase> <goals> <!-- 使用插件的什么功能,当然是混淆--> <goal>proguard</goal> </goals> </execution> </executions> <configuration> <!-- 是否将生成的PG文件安装部署--> <attach>true</attach> <!-- 是否混淆--> <obfuscate>true</obfuscate> <!-- 指定生成文件分类 --> <attachArtifactClassifier>pg</attachArtifactClassifier> <options> </options> <outjar>${project.build.finalName}-pg.jar</outjar> <!-- 添加依赖,这里你可以按你的需要修改,这里测试只需要一个JRE的Runtime包就行了 --> <libs> <!-- ${java.home}/jre/lib/rt.jar--> <lib>/Users/User/Library/Java/JavaVirtualMachines/amazon-corretto-8.jdk/Contents/Home/jre/lib/rt.jar</lib> </libs> <!-- 加载文件的过滤器,就是你的工程目录了--> <!-- <inFilter>com/example/test/shiro_spring/**</inFilter>--> <injar>classes</injar> <!-- 输出目录--> <outputDirectory>${project.build.directory}</outputDirectory> </configuration> </plugin> </plugins> </build>
<build>
    <plugins>
        <!-- ProGuard混淆插件-->
        <plugin>
            <groupId>com.github.wvengen</groupId>
            <artifactId>proguard-maven-plugin</artifactId>
            <version>2.5.3</version>
            <executions>
                <execution>
                    <!-- 混淆时刻,这里是打包的时候混淆-->
                    <phase>package</phase>
                    <goals>
                        <!-- 使用插件的什么功能,当然是混淆-->
                        <goal>proguard</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <!-- 是否将生成的PG文件安装部署-->
                <attach>true</attach>
                <!-- 是否混淆-->
                <obfuscate>true</obfuscate>
                <!-- 指定生成文件分类 -->
                <attachArtifactClassifier>pg</attachArtifactClassifier>
                <options>
                </options>
                <outjar>${project.build.finalName}-pg.jar</outjar>
                <!-- 添加依赖,这里你可以按你的需要修改,这里测试只需要一个JRE的Runtime包就行了 -->
                <libs>
<!--						${java.home}/jre/lib/rt.jar-->
                    <lib>/Users/User/Library/Java/JavaVirtualMachines/amazon-corretto-8.jdk/Contents/Home/jre/lib/rt.jar</lib>
                </libs>
                <!-- 加载文件的过滤器,就是你的工程目录了-->
<!--					<inFilter>com/example/test/shiro_spring/**</inFilter>-->
                <injar>classes</injar>
                <!-- 输出目录-->
                <outputDirectory>${project.build.directory}</outputDirectory>
            </configuration>

        </plugin>
    </plugins>
</build>

接下来配置proguard的混淆规则,在pom.xml的同级目录下新增proguard.conf,内容如下(内容都有注释,可以根据自己的实际情况做修改):

# 忽略所有警告,否则有警告的时候混淆会停止
-ignorewarnings
# JDK目标版本11,或者1.8这类
-target 11
# 不做收缩(删除注释、未被引用代码)
-dontshrink
# 不做优化(变更代码实现逻辑)
-dontoptimize
# 不路过非公用类文件及成员
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
# 优化时允许访问并修改有修饰符的类和类的成员
-allowaccessmodification
# 确定统一的混淆类的成员名称来增加混淆
-useuniqueclassmembernames
# 不混淆所有包名,本人测试混淆后WEB项目问题实在太多,毕竟Spring配置中有大量固定写法的包名
-keeppackagenames
# 不混淆局部变量名
-keepparameternames
# 不混淆所有特殊的类 LocalVariable*Table,
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,Synthetic,EnclosingMethod
# 不混淆包下的所有类名
-keep class com.example.test.** { <methods>; }
-keep class com.example.test.service.** { <methods>; }
-keep class com.example.test.dao.** { <methods>; }
# 不混淆quartz包下的所有类名,且类中的方法也不混淆
-keep class com.example.test.quartz.** { <methods>; }
# 不混淆model包中的所有类以及类的属性及方法,实体包,混淆了会导致ORM框架及前端无法识别
-keep class com.example.test.entity.** {*;}
# 不混淆所有的set/get方法,毕竟项目中使用的部分第三方框架(例如Shiro)会用到大量的set/get映射
-keepclassmembers public class * {void set*(***);*** get*();}
# 保持类protected不被混淆
-keep public class * { public protected <fields>;public protected <methods>; }
# 忽略所有警告,否则有警告的时候混淆会停止 -ignorewarnings # JDK目标版本11,或者1.8这类 -target 11 # 不做收缩(删除注释、未被引用代码) -dontshrink # 不做优化(变更代码实现逻辑) -dontoptimize # 不路过非公用类文件及成员 -dontskipnonpubliclibraryclasses -dontskipnonpubliclibraryclassmembers # 优化时允许访问并修改有修饰符的类和类的成员 -allowaccessmodification # 确定统一的混淆类的成员名称来增加混淆 -useuniqueclassmembernames # 不混淆所有包名,本人测试混淆后WEB项目问题实在太多,毕竟Spring配置中有大量固定写法的包名 -keeppackagenames # 不混淆局部变量名 -keepparameternames # 不混淆所有特殊的类 LocalVariable*Table, -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,Synthetic,EnclosingMethod # 不混淆包下的所有类名 -keep class com.example.test.** { <methods>; } -keep class com.example.test.service.** { <methods>; } -keep class com.example.test.dao.** { <methods>; } # 不混淆quartz包下的所有类名,且类中的方法也不混淆 -keep class com.example.test.quartz.** { <methods>; } # 不混淆model包中的所有类以及类的属性及方法,实体包,混淆了会导致ORM框架及前端无法识别 -keep class com.example.test.entity.** {*;} # 不混淆所有的set/get方法,毕竟项目中使用的部分第三方框架(例如Shiro)会用到大量的set/get映射 -keepclassmembers public class * {void set*(***);*** get*();} # 保持类protected不被混淆 -keep public class * { public protected <fields>;public protected <methods>; }
# 忽略所有警告,否则有警告的时候混淆会停止
-ignorewarnings

# JDK目标版本11,或者1.8这类
-target 11

# 不做收缩(删除注释、未被引用代码)
-dontshrink

# 不做优化(变更代码实现逻辑)
-dontoptimize

# 不路过非公用类文件及成员
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers

# 优化时允许访问并修改有修饰符的类和类的成员
-allowaccessmodification

# 确定统一的混淆类的成员名称来增加混淆
-useuniqueclassmembernames

# 不混淆所有包名,本人测试混淆后WEB项目问题实在太多,毕竟Spring配置中有大量固定写法的包名
-keeppackagenames

# 不混淆局部变量名
-keepparameternames

# 不混淆所有特殊的类 LocalVariable*Table,
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,Synthetic,EnclosingMethod

# 不混淆包下的所有类名
-keep class com.example.test.** { <methods>; }
-keep class com.example.test.service.** { <methods>; }
-keep class com.example.test.dao.** { <methods>; }

# 不混淆quartz包下的所有类名,且类中的方法也不混淆
-keep class com.example.test.quartz.** { <methods>; }

# 不混淆model包中的所有类以及类的属性及方法,实体包,混淆了会导致ORM框架及前端无法识别
-keep class com.example.test.entity.** {*;}

# 不混淆所有的set/get方法,毕竟项目中使用的部分第三方框架(例如Shiro)会用到大量的set/get映射
-keepclassmembers public class * {void set*(***);*** get*();}

# 保持类protected不被混淆
-keep public class * { public protected <fields>;public protected <methods>; }

编译混淆结果

以上就是所有的配置了。

IDEA下双击proguard:proguard就可以生成混淆后的jar(在项目的target下生成了classes-pg.jar)了,可以使用jd-gui打开查看混淆的效果

实际如果要部署到tomcat下,可以把classes-pg.jar用压缩软件解开,然后里面的classes文件夹复制到tomcat的相关文件夹下(一般是webapps/ROOT/WEB-INF/下)

另外如果是SpringBoot下用proguard混淆会更简单一些,详见:https://blog.terrynow.com/2022/11/19/proguard-obfuse-springboot-maven-jar-implement-and-samples/

admin

这个人很懒,什么都没留下

文章评论

您需要 登录 之后才可以评论