proguard混淆springboot/maven项目的实现和例子

2022-11-19 669点热度 0人点赞 0条评论

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

SpringBoot下如何配置proguard?SpringBoot下的配置应该还要简单很多。

准备proguard配置文件proguard.cfg(内容都有注释,可以根据自己的实际情况做修改):

# 忽略所有警告,否则有警告的时候混淆会停止
-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>; }

maven配置pom.xml

<build>
    <plugins>
        <plugin>
            <groupId>com.github.wvengen</groupId>
            <artifactId>proguard-maven-plugin</artifactId>
            <version>2.6.0</version>
            <executions>
                <!-- 以下配置说明执行mvn的package命令时候,会执行proguard-->
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>proguard</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <!-- 就是输入Jar的名称,我们要知道,代码混淆其实是将一个原始的jar,生成一个混淆后的jar,那么就会有输入输出。 -->
                <injar>${project.build.finalName}.jar</injar>
                <!-- 输出jar名称,输入输出jar同名的时候就是覆盖,也是比较常用的配置。 -->
                <outjar>${project.build.finalName}.jar</outjar>
                <!-- 是否混淆 默认是true -->
                <obfuscate>true</obfuscate>
                <!-- 配置一个文件,通常叫做proguard.cfg,该文件主要是配置options选项,也就是说使用proguard.cfg那么options下的所有内容都可以移到proguard.cfg中 -->
                <proguardInclude>${project.basedir}/proguard.cfg</proguardInclude>
                <!-- 添加依赖,这里你可以按你的需要修改,这里测试只需要一个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>
                <!-- 对输入jar进行过滤比如,如下配置就是对META-INFO文件不处理。 -->
                <inLibsFilter>!META-INF/**,!META-INF/versions/9/**.class</inLibsFilter>
                <!-- 这是输出路径配置,但是要注意这个路径必须要包括injar标签填写的jar -->
                <outputDirectory>${project.basedir}/target</outputDirectory>
                <!--这里特别重要,此处主要是配置混淆的一些细节选项,比如哪些类不需要混淆,哪些需要混淆-->
                <options>
                    <!-- 可以在此处写option标签配置,不过我上面使用了proguardInclude,故而我更喜欢在proguard.cfg中配置 -->
                </options>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                    <configuration>
                        <!-- 修改你的实际启动了的package包名和Class名称-->
                        <mainClass>com.example.test.MyApplication</mainClass>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

这样就能看到了:

然后点击package,正常执行编译打包流程就可以 :

检查下项目的target下面应该又生成了类似:

混淆后的jar文件 myapp-0.0.1-SNAPSHOT.jar

原始的jar文件 myapp-0.0.1-SNAPSHOT_proguard_base.jar

admin

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

文章评论

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