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

2022-11-02 381点热度 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>

接下来配置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>; }

编译混淆结果

以上就是所有的配置了。

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

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

文章评论

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