Maven - 代码混淆proguard-maven-plugin vs 代码加密classfinal
ProGuard是一个Java代码混淆工具,它可以让你的Java程序变得更小、更快,同时也更安全。因为Java代码很容易被反编译,所以有时候需要对代码进行混淆,以保护你的知识产权。
ProGuard主要做了三件事:
ProGuard会自动混淆大部分代码,但有些代码不应该被混淆,比如注解、native方法、反射用到的方法等,需要在配置文件中指定保留
-keep class com.example.** { *; }
混淆后的代码虽然很难看懂,但还是可以被反编译的。所以ProGuard只是增加了反编译的难度,并不能完全防止代码被反编译。
总之,ProGuard是一个很好用的Java代码混淆工具,可以保护你的代码,让你的程序变小变快。只要会一点点配置,就可以很容易地使用它了。
https://github.com/wvengen/proguard-maven-plugin
https://wvengen.github.io/proguard-maven-plugin/
# 指定Java编译目标版本为1.8
-target 1.8
# Proguard配置项:指定不进行代码缩小优化
-dontshrink
# 指定不进行字节码级别的优化
-dontoptimize
# 混淆时不生成大小写混合的类名
-dontusemixedcaseclassnames
# 混淆时使用唯一类成员命名策略
-useuniqueclassmembernames
# 同上,再次指定不生成大小写混合的类名
-dontusemixedcaseclassnames
# 混淆类名后,对使用Class.forName('className')等进行相应替代
-adaptclassstrings
# 保留异常、内部类、签名、弃用注解、源文件、行号表、注解、封装方法等信息
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
# 保留所有接口的原始名称不进行混淆
-keepnames interface ** { *; }
# 保留所有包中原始接口文件不进行混淆
# -keep interface * extends * { *; }
# 保留方法参数名
-keepparameternames
# 保留枚举成员及方法
-keepclassmembers enum * { *; }
# 不混淆所有类,保留特定注解的原始定义注释
-keepclassmembers class * {
@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 *;
}
# 忽略warn消息
-ignorewarnings
# 忽略note消息
-dontnote
# 打印配置信息
-printconfiguration
# 保持启动类不被混淆
-keep public class com.artisan.pg.example.ProguardApplication {
public static void main(java.lang.String[]);
}
重点关注 -keep
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>boot2</artifactId>
<groupId>com.artisan</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>boot-proguard</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
<!-- 定义构建插件 -->
<build>
<plugins>
<!-- Proguard Maven 插件配置,用于代码混淆 -->
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.6.0</version>
<executions>
<!-- 配置执行阶段为package,即在打包时执行代码混淆 -->
<execution>
<phase>package</phase>
<goals>
<goal>proguard</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 指定输入Jar文件名 -->
<injar>${project.build.finalName}.jar</injar>
<!-- 指定输出Jar文件名,与输入Jar同名,实现覆盖 -->
<outjar>${project.build.finalName}.jar</outjar>
<!-- 混淆开关,默认为true -->
<obfuscate>true</obfuscate>
<!-- 指向proguard配置文件 -->
<proguardInclude>${project.basedir}/proguard.cfg</proguardInclude>
<!-- 添加额外的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中的文件,例如不处理META-INF目录下的文件 -->
<inLibsFilter>!META-INF/**,!META-INF/versions/9/**.class</inLibsFilter>
<!-- 指定输出目录 -->
<outputDirectory>${project.basedir}/target</outputDirectory>
<!-- 混淆配置的细节选项,例如指定哪些类不进行混淆,可选配置项 -->
<options>
<!-- 具体的混淆配置可在此处或外部配置文件中定义 -->
</options>
</configuration>
</plugin>
<!-- Spring Boot Maven 插件配置,用于打包可执行的Jar包 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<!-- 配置执行阶段为repackage,即重新打包 -->
<execution>
<goals>
<goal>repackage</goal>
</goals>
<!-- 指定主类路径 -->
<configuration>
<mainClass>com.artisan.pg.example.ProguardApplication</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
推荐 代码加密classfinal , 不推荐Proguard,太复杂