Spring-ClassFinal

需求

需要对java8+Spingboot项目进行编译后的jar包混淆。

方案一:ClassFinal

ClassFinal是一款java class文件安全加密工具,支持直接加密jar包,无需修改任何项目代码,兼容spring,可避免源码泄漏或字节码被反编译。

使用步骤

  1. ClassFinal下载classfinal-fatjar.jar

  2. 在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
    15
    FROM 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" ]
  3. 因为我才用的是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

常见问题

  1. 进行加密后,用 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>