java17、javafx项目混淆和加密方式

 更新时间:2025年09月24日 09:54:29   作者:筱诗诗  
文章介绍了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.

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java实现分页查询功能

    Java实现分页查询功能

    这篇文章主要为大家详细介绍了Java实现分页查询功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 带你入门Java的集合

    带你入门Java的集合

    Java的集合类型都是对java.util包中Collection接口的继承,这里我们主要介绍依赖于collection的一些主分支,一起来看一下Java中的collection集合类型总结
    2021-07-07
  • SpringBoot与SpringMVC第一讲

    SpringBoot与SpringMVC第一讲

    SpringMVC全名应该叫做SpringWebMVC,它其实是基于servlet来构建的一个原始web框架从一开始就包含在了spring框架中,下面通过实例代码给大家介绍SpringBoot与SpringMVC的相关知识,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • Elasticsearch 映射参数详解 fields

    Elasticsearch 映射参数详解 fields

    这篇文章主要介绍了fields Elasticsearch 映射参数fields,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java参数校验@Validated、@Valid介绍及使用详解

    Java参数校验@Validated、@Valid介绍及使用详解

    Javax.validation是 spring 集成自带的一个参数校验接口,可通过添加注解来设置校验条件,这篇文章主要介绍了Java参数校验@Validated、@Valid介绍及使用详解,需要的朋友可以参考下
    2024-08-08
  • Java Hibernate中使用HQL语句进行数据库查询的要点解析

    Java Hibernate中使用HQL语句进行数据库查询的要点解析

    HQL是Hibernate框架中提供的关系型数据库操作脚本,当然我们也可以使用原生的SQL语句,这里我们来看一下在Java Hibernate中使用HQL语句进行数据库查询的要点解析:
    2016-06-06
  • 无感NullPointerException的值相等判断方法

    无感NullPointerException的值相等判断方法

    当我们需要去判断一个 入参/查库 返回的开关变量(通常是个Integer类型的)时,常常会写如下的if-else判断语句。但又会为在生产环境看到的「NullPointerException」感到困扰,遇到这个问题如何处理呢,下面小编通过本文给大家详细讲解,需要的朋友参考下吧
    2023-02-02
  • SpringMVC RESTFul实战案例修改功能实现

    SpringMVC RESTFul实战案例修改功能实现

    这篇文章主要为大家介绍了SpringMVC RESTFul实战案例修改功能实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Java项目防止SQL注入的几种方式

    Java项目防止SQL注入的几种方式

    SQL注入是一种常见的攻击方式,黑客试图通过操纵应用程序的输入来执行恶意SQL查询,从而绕过认证和授权,窃取、篡改或破坏数据库中的数据,本文主要介绍了Java项目防止SQL注入的几种方式,感兴趣的可以了解一下
    2023-12-12
  • request如何获取body的json数据

    request如何获取body的json数据

    这篇文章主要介绍了request如何获取body的json数据操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06

最新评论