java jar包加密——xjar
java的jar包中的.class文件可以通过反汇编得到源码。这样一款应用的安全性就很难得到保证,别人只要得到你的应用,不需花费什么力气,就可以得到源码。这时候就需要对jar进行加密处理。
xjar是一个jar加密工具,有以下特点:
1、无代码侵入,只需要把编译好的jar包通过工具加密即可。
2、完全内存解密,降低源码以及字节码泄露或反编译的风险。
3、支持所有JDK内置加解密算法。
4、可选择需要加解密的字节码或其他资源文件。
5、支持Maven插件,加密更加便捷。
6、动态生成Go启动器
以下讲解通过Maven配置自动加密
打包
pom.xml配置
<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>
</execution>
</executions>
</plugin>
打包命令,强烈建议不要在pom.xml的xjar-maven-plugin配置中写上密码,这样会导致打包出来的xjar包中的pom.xml文件保留着密码,容易暴露密码。强烈建议通过mvn命令来指定加密密钥。
mvn clean install -Dxjar.password=密码 -Dmaven.test.skipt=true
对于Spring Boot项目或模块,该插件要后于spring-boot-maven-plugin插件执行,有两种方式:
- 将插件放置于spring-boot-maven-plugin的后面,因为其插件的默认phase也是package
- 将插件的phase设置为install,打包命令采用mvn clean install
注意事项
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>
2、Spring Boot + JPA(Hibernate) 启动报错问题
如果项目中使用了JPA且实现为Hibernate时,由于Hibernate自己解析加密后的jar文件,所以无法正常启动,可以采用以下解决方案。
clone XJar-Agent-Hibernate(https://github.com/core-lib/xjar-agent-hibernate),使用mvn clean package编译出 xjar-agent-hibernate-${version}文件
采用 xjar java -javaagent:xjar-agent-hibernate-${version}.jar -jar your-spring-boot-app.jar命令启动
3、静态文件浏览器无法加载完成问题
由于静态文件被加密后体积变大,SpringBoot会采用文件的大小作为Content-Length头返回给浏览器,但实际上通过xjar加载解密后文件大小恢复了原本的大小,所以浏览器认为还没接收完导致一直等待服务器。因此我们需要在加密时忽略静态文件的加密。
4、JDK-9及以上版本由于模块化导致XJar无法使用jdk.internal.loader包的问题解决方案
在启动时添加参数 --add-opens java.base/jdk.internal.loader=ALL-UNNAMED
xjar java --add-opens java.base/jdk.internal.loader=ALL-UNNAMED -jar encrypted.jar
参数说明
当includes 和 excludes 同时使用时,即加密在includes的范围内且排除了excludes的资源。
使用
通过加密成功后xjar会在输出的jar包同目录下生成一个名为 xjar.go 的go启动器源码文件,将xjar.go在不同的平台进行编译即可得到不同平台的启动器可执行文件,其中windows下文件名为xjar.exe而linux下为xjar。用于编译的机器需要安装Go环境(golang),用于运行的机器则可不必安装go环境。由于启动器自带的jar包防篡改校验,故启动器无法通用,即便密码相同也不行。
执行命令生成xjar文件:
go build xjar.go
运行,不支持-cp或-classpath的方式:
nohup xjar java [OPTIONS] -jar encrypted.jar [ARGS]更多推荐



所有评论(0)