使用Xjar给SpringBoot项目jar包加密
https://gitee.com/mirrors/XJar/
功能特性
- 无代码侵入, 只需要把编译好的JAR包通过工具加密即可.
- 完全内存解密, 降低源码以及字节码泄露或反编译的风险.
- 支持所有JDK内置加解密算法.
- 可选择需要加解密的字节码或其他资源文件.
- 支持Maven插件, 加密更加便捷.
- 动态生成Go启动器, 保护密码不泄露.
环境依赖
JDK 1.7 +
使用步骤
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.
- 用于编译的机器需要安装 Go 环境, 用于运行的机器则可不必安装 Go 环境, 具体安装教程请自行搜索.
- 由于启动器自带JAR包防篡改校验, 故启动器无法通用, 即便密码相同也不行.
4. 启动运行
/path/to/xjar /path/to/java [OPTIONS] -jar /path/to/encrypted.jar [ARGS]
/path/to/xjar /path/to/javaw [OPTIONS] -jar /path/to/encrypted.jar [ARGS]
nohup /path/to/xjar /path/to/java [OPTIONS] -jar /path/to/encrypted.jar [ARGS]
- 在 Java 启动命令前加上编译好的Go启动器可执行文件名(xjar)即可启动运行加密后的JAR包.
- 若使用 nohup 方式启动则 nohup 要放在Go启动器可执行文件名(xjar)之前.
- 若Go启动器可执行文件名(xjar)不在当前命令行所在目录则要通过绝对路径或相对路径指定.
- 仅支持通过 -jar 方式启动, 不支持-cp或-classpath的方式.
- -jar 后面必须紧跟着启动的加密jar文件路径
- 例子: 如果当前命令行就在 xjar 所在目录, java 环境变量也设置好了 ./xjar java -Xms256m -Xmx1024m -jar /path/to/encrypted.jar
注意事项
1. 不兼容 spring-boot-maven-plugin 的 executable = true 以及 embeddedLaunchScript
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!-- 需要将executable和embeddedLaunchScript参数删除, 目前还不能支持对该模式Jar的加密!后面可能会支持该方式的打包.
<configuration>
<executable>true</executable>
<embeddedLaunchScript>...</embeddedLaunchScript>
</configuration>
-->
</plugin>