0. 前言
在部署SpringBoot项目时,如果不对其进行加密,源码就会有泄露的风险。具体来说,当攻击者获得到我们部署的jar
包之后,通过jd-gui
工具对其进行反编译即可看到源码。所以需要在打包之前对项目文件进行加密。我查到的加密工具有xjar
、Proguard
等。这篇文章以xjar
为例对SpringBoot项目进行加密打包。
1. 准备工作
- 开发环境下(windows)下载
maven
,用于打包SpringBoot项目 - 开发环境下(windows)下载
jd-gui
,用于对打包文件进行反编译 - 部署环境下(Linux)下载
go
,用于对xjar打包的go文件进行编译
2. SpringBoot添加xjar依赖
2.1 修改pom.xml文件
主要添加两个东西:
- jitpack.io插件仓库
- xjar插件
<!-- 设置 jitpack.io 插件仓库 -->
<pluginRepositories>
<pluginRepository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</pluginRepository>
</pluginRepositories>
<build>
<finalName>xxx</finalName>
<plugins>
<!-- xjar -->
<plugin>
<groupId>com.github.core-lib</groupId>
<artifactId>xjar-maven-plugin</artifactId>
<version>4.0.2</version>
<executions>
<execution>
<id>xjar</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<targetJar>${project.artifactId}-xjar.jar</targetJar> // 加密打包后的文件名
</configuration>
</plugin>
</plugins>
</build>
2.2 可能遇到的bug
2.2.1 没有添加jitpack.io
打包的时候会遇到下载的问题。
2.2.2 将password写在configuration配置节中
有的博客会把xjar打包所用的密码直接写到configuration配置节中,比如:
<!-- xjar -->
<configuration>
<targetJar>${project.artifactId}-xjar.jar</targetJar>
<password>your_password</password> // 直接把密码写在这里
</configuration>
这样仍然会有问题。xjar是不会加密pom.xml文件的。当打包完成之后,攻击者对jar包进行反编译,还是可以看到打包所使用的密码,从而造成泄露。在第3步中会讲解密码应该写在哪里。
2.2.3 部署后接口无法返回页面
首先描述一下完整的问题:
我用SpringBoot和Thymeleaf写了一个项目,在Thymeleaf中,每个html引入了外部js文件和css文件,这些文件在resources文件夹中。在项目打包时,我通过xjar对其进行了加密。我发现加密之后,接口无法引入外部的js文件和css文件了,导致访问接口时页面显示空白;但是如果不用xjar加密,则接口访问正常。
最后根据chatgpt的回答解决了。主要问题就是xjar
在加密打包时,会修改资源文件的路径,而js
、css
文件都是资源文件,所以无法正确加载文件。那解决方案也很容易,通过excludes
配置节排除对资源文件的打包就行。
具体写法:
<!-- xjar -->
<plugin>
<groupId>com.github.core-lib</groupId>
<artifactId>xjar-maven-plugin</artifactId>
<version>4.0.2</version>
<executions>
<execution>
<id>xjar</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<targetJar>${project.artifactId}-xjar.jar</targetJar>
// excludes配置节,不对哪些文件进行加密
<excludes>
<exclude>
static/**
</exclude>
<exclude>
templates/**
</exclude>
</excludes>
</configuration>
</plugin>
3. 加密打包
打开终端,执行如下命令:
mvn clean package -Dxjar.password=<your_password> # 密码应该写在这里
产生的目录结构为:
其中,xxx-xjar.jar
是加密打包后的文件(文件名和在pom.xml中配置的相同)。之后我们部署主要用到两个文件:xxx-xjar.jar
和xjar.go
。
4. 测试加密效果
这里准备两版打包文件:没有使用xjar打包的未加密jar包(假设名字为xxx.jar
)、使用了xjar打包的加密jar包(xxx-xjar.jar
)。然后用jd-gui
分别打开xxx.jar
和xxx-xjar.jar
,观察文件结果。
这里就不放截图了,文字说明一下加密后的文件:文件大部分都为空,或者是乱码。
5. 项目部署
首先把xxx-xjar.jar
和xjar.go
上传到服务器上,然后对xjar.go
文件进行编译:
go build xjar.go
这一步会生成一个可执行文件xjar
。然后执行命令:
xjar java -jar xxx-xjar.jar
项目启动成功,说明部署完成。