Spring Boot Java应用代码混淆介绍

本文简要介绍一下开源Java混淆编译工具ProGuard的实际应用案例。我们知道某些情况下软件的作者需要保护软件本身不被使用者反编译,或者给对方反编译制造一定的障碍,为了达到这个目的人们可以有很多不同的做法,比如在编译的过程中把一些变量名替换成无意义的abcd或者将类名方法打散等等,制造一些混乱让反编译的人很难读懂你的逻辑;还有一种是对java编译后的class文件加密,然后用自定义的classLoader去解密并加载到JVM,这种方式有个问题,一旦对方拿到你这个自定义的ClassLoader那么保密也就不存在了。相信类似的技术手段还有很多,用ProGuard对Spring Boot的应用做混淆处理

文末有示例代码,这里只记录主要步骤:

  1. 混淆工具依赖到工程pom.xml
  2. guard.conf到Spring boot应用
  • 不包括 hibernate模型的字段或者隐式配置的列名
  • 不包括 JpaRepository类的方法名
  1. 配置proguard-maven-plugin
  • 指定proguard.conf文件位置
  • 添加java runtime包

    1
    2
    3
    <libs>
    <lib>${java.home}/lib/rt.jar</lib>
    </libs>
  • 指定想要混淆的模块名称,proguard maven 插件会将其转换成 –injar参数,比如:

    1
    2
    3
    4
    5
    6
    7
    8
    <assembly>
    <inclusions>
    <inclusion>
    <groupId>org.alext.learning</groupId>
    <artifactId>bsmod</artifactId>
    </inclusion>
    </inclusions>
    </assembly>
  1. Proguar会把所有injars合并到一个公共的混淆jar包,所以这里还需要把未混淆的jar从Spring boot的输出jar里面去掉,这里可以用spring-boot-maven-plugin来排除上一步指定的injars

    1
    2
    3
    4
    5
    6
    7
    8
    <configuration>
    <excludes>
    <exclude>
    <groupId>org.alext.learning</groupId>
    <artifactId>bsmod</artifactId>
    </exclude>
    </excludes>
    </configuration>
  2. 运行混淆编译

    1
    mvn clean package -DskipTests=true -P obfuscation
  3. 运行jar

    1
    java -jar uxmod/target/uxmod-1.0-SNAPSHOT.jar

访问http://localhost:8085/验证应用
mark
浏览输出jar文件可以看到uxmod-1.0-SNAPSHOT.jar\BOOT-INF\lib不包含我们之前指定的-injars模块(bsmod.jar)。bsmod类与uxmod类合并到一起,混淆后的类在uxmod-1.0-SNAPSHOT.jar\classes

上例中的完整代码可以在github上找到请参考