blog/src/programming/java/工具箱/XJar.md
LiuMangMang 704bef9502 docs: 更新图标并优化文档结构
- 为多个文档添加或更新图标,提升视觉一致性
- 优化文档结构,提高内容的可读性和导航性
- 添加新功能和修复记录,保持文档与项目同步
2025-07-14 20:35:23 +08:00

7.6 KiB
Raw Blame History

icon date category tag title
mdi:shield-lock 2025-05-13
JAVA
加密
xjar
XJar

XJar保护您的Java应用程序免受反编译和源码泄露

XJar保护您的Java应用程序免受反编译和源码泄露

介绍一个强大且实用的工具——XJar。它专为Spring Boot JAR和原生JAR提供安全加密运行支持能够有效防止源码泄露和反编译的风险。无论你是想保护个人项目还是企业级应用XJar都能为你提供一个简单而高效的解决方案。

GitHub: https://github.com/core-lib/xjar

什么是XJar

XJar是一个开源工具通过对JAR包内的资源进行加密并结合扩展的ClassLoader构建了一套程序加密启动和动态解密运行的机制。它特别适合Spring Boot项目同时也支持原生JAR旨在帮助开发者保护Java应用程序的安全性。

功能特性

XJar提供了以下核心功能让它在加密工具中脱颖而出

  • 无代码侵入无需修改源代码只需对编译好的JAR包进行加密即可。
  • 完全内存解密:资源在运行时动态解密,减少源码或字节码泄露的风险。
  • 支持所有JDK内置加解密算法:灵活选择适合你的加密算法。
  • 资源加密灵活性:支持选择需要加密的字节码或其他资源文件。
  • Maven插件支持:集成到构建流程,加密更便捷。
  • Go启动器动态生成Go语言启动器保护密码不泄露。

环境依赖

  • JDK版本1.7及以上

使用步骤

下面我将详细介绍如何使用XJar加密你的JAR包步骤清晰易懂。

1. 添加依赖

首先在你的Maven项目中添加XJar依赖并配置jitpack.io仓库

<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>
        </dependency>
    </dependencies>
</project>

小贴士如果只是用JUnit测试加密过程可以将<scope>设置为test

2. 加密源码

使用XJar提供的XCryptos.encryption()方法对JAR包进行加密

XCryptos.encryption()
        .from("/path/to/read/plaintext.jar") // 待加密JAR包路径
        .use("io.xjar")                      // 加密密码
        .include("/io/xjar/**/*.class")      // 需要加密的字节码
        .include("/mapper/**/*Mapper.xml")   // 需要加密的资源文件
        .exclude("/static/**/*")             // 排除静态文件
        .exclude("/conf/*")                  // 排除配置文件
        .to("/path/to/save/encrypted.jar");  // 输出加密后的JAR包
  • includeexclude支持ANT表达式或正则表达式灵活控制加密范围。
  • 当两者同时使用时,加密范围为include内排除exclude后的资源。

3. 编译脚本

加密完成后XJar会在输出目录生成一个xjar.go文件。这是Go语言编写的启动器源码需要编译为可执行文件

  • Windows:编译后生成xjar.exe
  • Linux:编译后生成xjar

编译需要Go环境但运行时无需Go支持。注意启动器带有防篡改校验无法通用。

4. 启动运行

使用编译好的启动器运行加密后的JAR包

./xjar java -Xms256m -Xmx1024m -jar /path/to/encrypted.jar
  • 启动器需放在Java命令之前。
  • 仅支持-jar方式启动,不支持-cp-classpath
  • 使用nohup时,需写为:nohup ./xjar java -jar /path/to/encrypted.jar

注意事项

在使用XJar时以下问题可能影响你的体验我整理了解决方案供参考

1. Spring Boot Maven插件兼容性

XJar不支持spring-boot-maven-pluginexecutable = trueembeddedLaunchScript配置,需删除:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <!-- 删除以下配置 -->
    <!-- <configuration>
        <executable>true</executable>
        <embeddedLaunchScript>...</embeddedLaunchScript>
    </configuration> -->
</plugin>

2. Spring Boot + JPA(Hibernate)报错

若使用Hibernate启动可能报错。解决方法

  1. 克隆XJar-Agent-Hibernate,编译生成xjar-agent-hibernate-${version}.jar

  2. 启动命令添加代理:

    ./xjar java -javaagent:xjar-agent-hibernate-${version}.jar -jar your-app.jar
    

3. 静态文件加载问题

加密静态文件可能导致浏览器加载失败,建议排除加密:

.exclude("/static/**/*")
.exclude("/META-INF/resources/**/*")

4. JDK 9+模块化问题

在JDK 9及以上版本需添加参数

./xjar java --add-opens java.base/jdk.internal.loader=ALL-UNNAMED -jar /path/to/encrypted.jar

5. 阿里云Maven镜像问题

使用阿里云镜像时,需在mirrorOf中排除jitpack.io

<mirror>
    <id>alimaven</id>
    <mirrorOf>central,!jitpack.io</mirrorOf>
    <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>

插件集成

XJar提供了xjar-maven-plugin,可自动完成加密过程。

配置示例

<project>
    <pluginRepositories>
        <pluginRepository>
            <id>jitpack.io</id>
            <url>https://jitpack.io</url>
        </pluginRepository>
    </pluginRepositories>
    <build>
        <plugins>
            <plugin>
                <groupId>com.github.core-lib</groupId>
                <artifactId>xjar-maven-plugin</artifactId>
                <version>4.0.2</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>build</goal>
                        </goals>
                        <phase>package</phase>
                        <configuration>
                            <password>io.xjar</password>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

执行方式

  • 自动构建mvn clean package -Dxjar.password=io.xjar
  • 手动执行mvn xjar:build -Dxjar.password=io.xjar

强烈建议:不要在pom.xml中写死密码,通过命令行传递更安全!

参数说明

以下是xjar-maven-plugin的主要参数:

参数名称 命令参数 参数说明 参数类型 缺省值
password -Dxjar.password 密码字符串 String 必须
algorithm -Dxjar.algorithm 加密算法名称 String AES/CBC/PKCS5Padding
keySize -Dxjar.keySize 密钥长度 int 128
ivSize -Dxjar.ivSize 密钥向量长度 int 128
sourceDir -Dxjar.sourceDir 源JAR目录 File ${project.build.directory}
targetDir -Dxjar.targetDir 目标JAR目录 File ${project.build.directory}

更多详情见:xjar-maven-plugin

结尾

XJar以其无侵入性、灵活性和高效性成为保护Java应用的绝佳选择。无论是个人项目还是商业产品它都能帮你轻松加密JAR包确保代码安全。赶快试试吧