java17、javafx项目混淆和加密方式
作者:筱诗诗
文章介绍了Java17与JavaFX项目使用ProGuard进行混淆及Xjar加密的流程,包括依赖配置、混淆规则定义、构建执行、结果验证与加密参数设置,强调版本兼容性及保留关键类方法的重要性
java17、javafx项目混淆和加密
采用proguard进行混淆;xjar进行加密
混淆流程
1.添加依赖和插件
<plugin> <groupId>com.github.wvengen</groupId> <artifactId>proguard-maven-plugin</artifactId> <version>2.6.0</version> <dependencies> <dependency> <groupId>com.guardsquare</groupId> <artifactId>proguard-base</artifactId> <version>7.4.2</version> </dependency> <dependency> <groupId>com.guardsquare</groupId> <artifactId>proguard-core</artifactId> <version>9.1.1</version> </dependency> </dependencies> <executions> <execution> <id>obfuscation-packaging</id> <phase>package</phase> <goals> <goal>proguard</goal> </goals> <configuration> <proguardVersion>7.4.2</proguardVersion> <obfuscate>true</obfuscate> <attach>true</attach> <appendClassifier>false</appendClassifier> <addMavenDescriptor>true</addMavenDescriptor> <injar>${project.build.finalName}.jar</injar> <outjar>${project.build.finalName}.jar</outjar> <injarNotExistsSkip>true</injarNotExistsSkip> <libs> <lib>${java.home}/jmods</lib> </libs> </configuration> </execution> </executions> </plugin>
注意:dependency依赖需要写在plugin中,才会生效;jdk17需使用7.2.2以上的依赖版本,软件使用的版本为7.4.2
<configuration>
: 这个标签包含了 proguard 插件的配置选项。<proguardVersion>
: 指定 ProGuard 的版本。<obfuscate>
: 是否启用混淆。<attach>
: 是否将生成的 artifacts(构建产物)附加到项目的 artifact。<appendClassifier>
: 是否在生成的 artifact 上添加一个分类器。分类器是 Maven 用来区分同一个 groupId 和 artifactId,但不同版本或变体的机制。<addMavenDescriptor>
: 是否添加 Maven 描述符到输出的 jar。<injar>
: 指定输入 jar 的名称。<outjar>
: 指定输出混淆后的 jar 的名称。这里和输入 jar 使用了相同的名称,实际使用中可能希望使用不同的名称以保留原始 jar 文件。<injarNotExistsSkip>
: 如果输入的 jar 文件不存在,则是否跳过 ProGuard 处理。<libs>
: 指定 Java 类库的位置。ProGuard 需要这些类库来处理混淆中的类依赖问题。<lib>
: 实际类库的路径。这里指定了 Java 的jmods
目录,通常包含 Java 模块化系统的模块。
2.定义混淆规则
<option>-keepattributes *Annotation*</option> <option>-keep class com.xxx.xxx.view.** { *; }</option> <option>-keep class com.xxx.xxx.mapper.** { *; }</option> <option>-keep class com.xxx.xxx.domain.** { *; }</option> <option>-keep enum com.xxx.xxx.** { *; }</option> <option>-keep class com.xxx.xxx.Main {public static void main(java.lang.String[]);} </option>
<options>
: ProGuard 的具体配置选项,以 <option>
标签形式提供。
<option>
具体的使用的 ProGuard 配置指令。
-keepattributes \*Annotation\*
: 保留所有注解。-keep class com.xxx.xxx.view.\** { \*; }
和类似的行:指定保留特定包下的类和它们的成员。-keep enum com.xxx.xxx.\** { \*; }
: 保留枚举。-keep class com.xxx.xxx.Main {public static void main(java.lang.String[]);}
: 保留包含main
方法的入口类,这对于确保应用程序点可执行性至关重要。
3.执行混淆
通过maven package进行打包,ProGuard会在项目构建的过程中进行混淆操作。
4.检查混淆结果
混淆后的 class 文件将被包含在 jar 文件中,可以用任何Java反编译工具打开jar文件,查看混淆后的代码。确认没有遗漏混淆的类文件或方法。
5.测试混淆后的软件
混淆后进行全面测试,来确保软件各功能均正确运行。
加密流程
1. 添加依赖
<project> <!-- 设置 jitpack.io 仓库 --> <repositories> <repository> <id>jitpack.io</id> <url>https://jitpack.io</url> </repository> </repositories> <!-- 添加 XJar 依赖 --> <dependencies> <dependency> <groupId>com.github.core-lib</groupId> <artifactId>xjar</artifactId> <version>4.0.2</version> <!-- <scope>test</scope> --> </dependency> </dependencies> </project>
- 必须添加 https://jitpack.io Maven仓库.
- 如果使用 JUnit 测试类来运行加密可以将 XJar 依赖的 scope 设置为 test.
2. 加密源码
XCryptos.encryption() .from("/path/to/read/plaintext.jar") .use("io.xjar") .include("/io/xjar/**/*.class") .include("/mapper/**/*Mapper.xml") .exclude("/static/**/*") .exclude("/conf/*") .to("/path/to/save/encrypted.jar");
方法名称 | 参数列表 | 是否必选 | 方法说明 |
---|---|---|---|
from | (String jar) | 二选一 | 指定待加密JAR包路径 |
from | (File jar) | 指定待加密JAR包文件 | |
use | (String password) | 二选一 | 指定加密密码 |
use | (String algorithm, int keysize, int ivsize, String password) | 指定加密算法及加密密码 | |
include | (String ant) | 可多次调用 | 指定要加密的资源相对于classpath的ANT路径表达式 |
include | (Pattern regex) | 可多次调用 | 指定要加密的资源相对于classpath的正则路径表达式 |
exclude | (String ant) | 可多次调用 | 指定不加密的资源相对于classpath的ANT路径表达式 |
exclude | (Pattern regex) | 可多次调用 | 指定不加密的资源相对于classpath的正则路径表达式 |
to | (String xJar) | 二选一 | 指定加密后JAR包输出路径, 并执行加密. |
to | (File xJar) | 指定加密后JAR包输出文件, 并执行加密. |
- 指定加密算法的时候密钥长度以及向量长度必须在算法可支持范围内, 具体加密算法的密钥及向量长度请自行百度或谷歌.
- include 和 exclude 同时使用时即加密在include的范围内且排除了exclude的资源.
3. 编译脚本
go build xjar.go
- 通过步骤2加密成功后XJar会在输出的JAR包同目录下生成一个名为 xjar.go 的的Go启动器源码文件.
- 将 xjar.go 在不同的平台进行编译即可得到不同平台的启动器可执行文件, 其中Windows下文件名为 xjar.exe 而Linux下为 xjar.
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。