XJar功能特性
- 基于对JAR包内资源的加密以及拓展ClassLoader来构建的一套程序加密启动,动态解密运行的方案,避免源码泄露以及反编译。
 - 支持Maven插件
 - 加密过程需要Go环境;加密后生成Go启动器,保护密码不泄露
 - GitHub: GitHub - core-lib/xjar: Spring Boot JAR 安全加密运行工具,支持的原生JAR。Spring Boot JAR 安全加密运行工具,支持的原生JAR。. Contribute to core-lib/xjar development by creating an account on GitHub.
https://github.com/core-lib/xjar 
使用方法(手动执行方式)
- 添加Maven依赖
 
<!-- 添加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.0</version>
    </dependency>
</dependencies>
 
2. 对jar包进行加密的代码
XCryptos.encryption()
        .from("D:/jars/original.jar")
        .use("1@3$qWeR")
        .include("/io/xjar/**/*.class")
        .include("/mapper/**/*Mapper.xml")
        .exclude("/static/**/*")
        .exclude("/conf/*")
        .to("D:/files/encrypted.jar"); 
3.方法说明
| 方法 | 参数 | 说明 | 
| 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包输出路径,并执行加密 | 
- algorithm: JDK内置加密算法,如:AES/CBC/PKCS5Padding(缺省值)和DES/CBC/PKCS5Padding
 - keysize: 密钥长度,如:56、128(缺省值)、256
 - ivsize: 密钥向量长度,如:128(缺省值)
 
3.用Go进行编译,生成Go启动器
go build xjar.go 
 第2步执行成功之后,在指定目录下会输出加密的jar包以及一个xjar.go文件
 将 xjar.go 在不同的平台进行编译即可得到不同平台的启动器可执行文件,其中Windows下文件名为 xjar.exe 而Linux下为 xjar
 用于编译的机器需要安装 Go 环境,用于运行的机器则可不必安装 Go 环境
 由于启动器自带JAR包防篡改校验,故启动器无法通用,即便密码相同也不行
4.启动运行
xjar java -jar /path/to/encrypted.jar 
- 在 Java 启动命令前加上编译好的Go启动器可执行文件名(xjar)即可启动运行加密后的JAR包
 - 仅支持通过 -jar 方式启动,不支持-cp或-classpath的方式
 
使用方法(Maven插件方式)
Maven项目可通过集成 xjar-maven-plugin 以免去每次加密都要执行一次上述的代码,随着Maven构建自动生成加密后的JAR和Go启动器源码文件。
- 添加 xjar-maven-plugin
 
<project>
    <!-- 设置 jitpack.io 插件仓库 -->
    <pluginRepositories>
        <pluginRepository>
            <id>jitpack.io</id>
            <url>https://jitpack.io</url>
        </pluginRepository>
    </pluginRepositories>
    <!-- 添加 XJar Maven 插件 -->
    <build>
        <plugins>
            <plugin>
                <groupId>com.github.core-lib</groupId>
                <artifactId>xjar-maven-plugin</artifactId>
                <version>4.0.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>build</goal>
                        </goals>
                        <phase>package</phase>
                        <!-- 或使用
                        <phase>install</phase>
                        -->
                        <configuration>
                        	<!-- 建议password不要在pom文件中指定 -->
                            <password>io.xjar</password>
                            <!-- optional
                            <algorithm/>
                            <keySize/>
                            <ivSize/>
                            <includes>
                                <include/>
                            </includes>
                            <excludes>
                                <exclude/>
                            </excludes>
                            <sourceDir/>
                            <sourceJar/>
                            <targetDir/>
                            <targetJar/>
                            -->
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
 
对于Spring Boot 项目或模块, 该插件要后于 spring-boot-maven-plugin 插件执行, 有两种方式
- 将插件放置于 spring-boot-maven-plugin 的后面, 因为其插件的默认 phase 也是 package
 - 将插件的 phase 设置为 install(默认值为:package), 打包命令采用 mvn clean install
 
也可以通过Maven命令执行
mvn xjar:build -Dxjar.password=io.xjar
mvn xjar:build -Dxjar.password=io.xjar -Dxjar.targetDir=outputDir/encrypted.jar
 
但通常情况下是让XJar插件绑定到指定的phase中自动执行,这样就能在项目构建的时候自动构建出加密的包
mvn clean package -Dxjar.password=io.xjar
mvn clean install -Dxjar.password=io.xjar -Dxjar.targetDir=/directory/to/save/target.xjar
 
强烈建议
不要在 pom.xml 的 xjar-maven-plugin 配置中写上密码,这样会导致打包出来的 xjar 包中的 pom.xml 文件保留着密码,极其容易暴露密码!强烈推荐通过 mvn 命令来指定加密密钥!


















