Spring-ClassFinal
需求
需要对java8+Spingboot项目进行编译后的jar包混淆。
方案一:ClassFinal
ClassFinal是一款java class文件安全加密工具,支持直接加密jar包,无需修改任何项目代码,兼容spring,可避免源码泄漏或字节码被反编译。
使用步骤
在ClassFinal下载
classfinal-fatjar.jar
在dockerfile里面添加,这里面的关键命令
1
2
3
4
5
6
7
8
9
10
11进行加密jar包:
-file 加密的jar/war完整路径
-packages 加密的包名(可为空,多个用","分割)
-exclude 排除的类名(可为空,多个用","分割),一般排除启动类即可
-pwd 加密密码,如果是#号,则使用无密码模式加密,CF_PWD通过dokcer build的构建参数进行传递
java -jar classfinal-fatjar-1.2.1.jar -file app.jar -packages cn.com.exxk,com.manager -exclude cn.com.exxk.Application -pwd ${CF_PWD}
进行解密启动:
// 控制台输入密码:-javaagent:app-encrypted.jar
// 命令行指定密码:-javaagent:app-encrypted.jar='-pwd 123456'
// 环境变量指定密码:-javaagent:app-encrypted.jar='-pwdname CF_PWD',设置环境变量CF_PWD=123456
java -javaagent:app-encrypted.jar='-pwdname CF_PWD' -jar app-encrypted.jar完整的dockerfile如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15FROM exxk/java:8-jre-alpine-cst-font
ARG JAR_FILE
ARG CF_PWD
ADD target/${JAR_FILE}.jar app.jar
ADD src/main/docker/classfinal-fatjar-1.2.1.jar classfinal-fatjar-1.2.1.jar
RUN java -jar classfinal-fatjar-1.2.1.jar -file app.jar -packages cn.com.exxk,com.manager -exclude cn.com.exxk.Application -pwd ${CF_PWD} -Y && \
rm classfinal-fatjar-1.2.1.jar app.jar
ENV JAVA_OPTS -Xms128m -Xmx256m
ENV BOOT_PARAMS ""
EXPOSE 8080
ENTRYPOINT [ "sh", "-c", "java -javaagent:app-encrypted.jar='-pwdname CF_PWD' $JAVA_OPTS $JAVA_OPTS_AGENT -Djava.security.egd=file:/dev/./urandom -jar app-encrypted.jar $BOOT_PARAMS" ]因为我才用的是maven插件进行打包,所以对应的插件配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.13</version>
<executions>
<execution>
<id>default</id>
<phase>none</phase>
</execution>
<execution>
<id>after-deploy</id>
<phase>deploy</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<repository>exxk/base/${project.name}</repository>
<tag>${project.version}</tag>
<buildArgs>
<JAR_FILE>${project.build.finalName}</JAR_FILE>
<CF_PWD>123456(这里是设置的密码)</CF_PWD>
</buildArgs>
<dockerfile>src/main/docker/Dockerfile</dockerfile>
</configuration>
</plugin>
方案二:ProGuard
常见问题
进行加密后,用
tar -zxvf app-encrypted.jar
解压之后,发现里面有.java
的文件解决:检查xml里面的配置,有下面类似配置,一定要注释,因为打包的时候,把源码也copy进去了。
1
2
3
4
5
6
7
8
9
10
11<build>
<resources>
<!-- <resource>-->
<!-- <directory>src/main/java</directory>-->
<!-- <includes>-->
<!-- <include>**/**</include>-->
<!-- </includes>-->
<!-- <filtering>false</filtering>-->
<!-- </resource>-->
</resources>
</build>