SpringBoot项目——混淆加密
Java是一种跨平台的编程语言,代码运行之前会被JDK编译成字节码文件。在Java字节码中包括了很多源代码信息,比如变量名、方法名等等,并且通过这些名称来访问变量和方法,这些符号带有许多语义信息,很容易被反编译成Java源代码。平时我们在分发和部署项目的时候,为了保护我们自己的知识产权,通常要对Java代码进行混淆加密。
Oracle数据库是用Java开发的,如果代码不混淆加密的话,任何人都能通过反编译程序,获取到Oracle的源代码。以Oracle的行事作风,所有影响赚钱的事情,它必须根除。
一、如何使用反编译器
讲加密混淆之前,我先跟你谈谈如何使用软件反编译Java字节码。反编译工具目前有很多,例如JD-GUI、Luyten、Jadx等等。我以Luyten举例子,大家可以访问下面的网址,下载到这个反编译软件。
http://java-decompiler.github.io/
二、如何对字节码反编译
刚才我们看到反编译之后的结果,如果我们分发要部署的Java程序,不对字节码混淆加密,那么别人可以轻松获得你的源码。对于商业产品,这肯定是能允许的。
目前Java混淆工具有很多,比如有ProGuard、JODE、RetroGuard等等。但是它们都有一个问题,那就是对SpringBoot支持的不够好。你对普通的JAR文件或者字节码文件混淆是可以的,但是在SpringBoot项目中,这些混淆器就没法使用。
我向大家推荐allatori这个混淆工具,它对SpringBoot和Maven支持的不错,我们用Maven打包的时候,allatori可以对字节码进行混淆。
步骤一:
首先我们在IDEA项目中创建allatori文件夹(名字可以自定义),然后把从allatori官网下载到的allatori.jar文件放入其中,然后还要创建allatori.xml文件,要定义的内容如下:
<config>
<input>
<!--in属性规定的是我们对那个JAR文件的字节码混淆,out属性是混淆后的JAR文件存放路径-->
<jar in="D:\emos-workflow\target\emos-workflow-0.0.1-SNAPSHOT.jar"
out="D:\emos-workflow\target\emos-workflow-obfuscated.jar"/>
</input>
<keep-names>
<class access="protected+">
<field access="protected+"/>
<method access="protected+"/>
</class>
</keep-names>
<ignore-classes>
<!--这些都是不需要被混淆加密的类-->
<class template="class *springframework*" />
<class template="class *jni*" />
<class template="class *alibaba*"/>
<!--引用了RedisTemplate的Java类被混淆之后,Spring创建对象会有一场,所以不用混淆-->
<class template="class com.example.emos.workflow.config.quartz.MeetingRoomJob"/>
</ignore-classes>
<property name="log-file" value="log.xml"/>
</config>
步骤二:
然后在pom.xml文件中,添加标签,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project …… >
……
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>copy-and-filter-allatori-config</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target</outputDirectory>
<resources>
<resource>
<directory>${basedir}/allatori</directory>
<includes>
<include>allatori.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>run-allatori</id>
<phase>package</phase>
<goals>
<goal>exec</goal>
</goals>
</execution>
</executions>
<configuration>
<executable>java</executable>
<arguments>
<argument>-Xms128m</argument>
<argument>-Xmx512m</argument>
<argument>-jar</argument>
<argument>${basedir}/allatori/allatori.jar</argument>
<argument>${basedir}/allatori/allatori.xml</argument>
</arguments>
</configuration>
</plugin>
……
</plugins>
</build>
</project>
步骤三:
接下来我们开始对SpringBoot打包,而且要执行两次打包操作才可以。如果只执行一次打包操作,那么打包出来的混淆JAR文件不会包含SpringBoot项目的依赖库文件。只有执行了第二次打包之后,混淆出来的JAR文件里面才会包含依赖库文件,这一点切记!
步骤四:
下面target目录下找对应的jar文件,这个JAR文件就是混淆之后的JAR文件,你不妨可以查看文件的体积,应该是几十MB的样子,这样的JAR文件才能运行。
我们用反编译软件打开这个JAR文件,大家都看到了,反编译之后的源代码完全是乱码,阅读起来非常困难,这就起到了保护源代码的目的。