1. 原因
由于看到很多的java项目通过反编译jar包能够看到代码的具体实现,相当于将所有的逻辑都暴露在外,会造成很大的危险,因此,本次主要学习一下关于如何预防此类问题的方法,本文主要讨论通过代码混淆的方式来对打包出来的jar包进行处理
2. 代码混淆(取自百度百科)
百度百科对于代码混淆的解释:代码混淆亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。代码混淆可以用于程序的源代码,也可以用于程序编译而成的中间代码。执行代码混淆的程序被称作代码混淆器。
主要是首先将代码中的各种元素,如变量,函数,类的名字改写成无意义的名字。比如改写成单个的字符,或者简短的无意义字母组合,甚至改写成"__"这样的符号,使得阅读的人无法通过名字猜测其用途;其次,重写代码的逻辑,使其变为功能上等价,但是更困难的理解形式。例如将for循环改成while循环,将循环改成递归,精简中间的变量等(视具体的混淆器功能而定);最后,打乱代码的格式,比如删除空格,将多行代码挤到一行等
java的代码混淆就是对java的字节码(.class)文件进行混淆
混淆代码带来的问题:
被混淆的代码难于理解,因此,调试和除错也变得困难起来
对于支持反射的语言,代码混淆有可能与反射发生冲突
代码混淆并不能真正的组织反向工程,只能增大其难度,因此对于安全性要求很高的场合,仅仅使用代码混淆并不能保证源代码安全
3. Allatori混淆技术(https://github.com/Lovnx/confusion)
Allatori是一个java的混淆器,它属于第二代混淆器,因此能够全方位的保护只是产权
Allatori主要保护方式:1.命名混淆、2.流混淆、3.调试信息混淆、4.字符串混淆以及水印技术
支持war和jar文件格式
此外使用Allatori打包的大小会小一点
4. 使用方法(https://github.com/Lovnx/confusion)
具体使用方法参照标题中的网址,此处根据git上的项目将步骤简化一下,已测试,可以使用在Springboot项目中
项目目录:
1) pom文件需要添加内容:
<!-- Allatori plugin start -->
<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>1.2.1</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}/lib/allatori.jar</argument>
<argument>${basedir}/target/allatori.xml</argument>
</arguments>
</configuration>
</plugin>
<!-- Allatori plugin end -->
主要需要关注的两个配置,一个是allatori的jar包地址,一个是指定混淆策略的xml文件
<argument>${basedir}/lib/allatori.jar</argument>
<argument>${basedir}/target/allatori.xml</argument>
2) allatori.xml文件
<config>
<input>
<jar in="confusion-0.0.1-SNAPSHOT.jar" out="confusion-0.0.1-SNAPSHOT-obfuscated.jar"/>
</input>
<keep-names>
<class access="protected+">
<field access="protected+"/>
<method access="protected+"/>
</class>
</keep-names>
<property name="log-file" value="log.xml"/>
</config>
为配置策略的文件,后续会具体解释各个标签以及属性的名称allatori.xml配置文件,此处只介绍具体使用方法,其中的jar标签中的in为未混淆时打出的包名,可以在target目录下获取到,out为输出的混淆jar包的名称,可以与未混淆的jar包打出的包名一样
3) 打包步骤
(1)在控制台中执行mvn clean install (会报错,不用关心报错信息,此处执行主要是为了删除原有的target文件夹而后生成一个新的target文件夹)
(2)将allatori.xml移动到target目录下面(在pom中配置了allatori的路径在target下,具体移动到其他目录下是否可行没试过,感兴趣的话可以尝试一下)
(3)前两步执行完毕后执行mvn install(千万不要执行mvn clean install或其他带clean的操作,否则需要重新将allatori.xml文件移动到target下)
4) 成功后工程目录
5. 混淆遇到的问题
1)混淆主要是对java进行混淆,像是xml文件等一些配置文件不会被混淆
2)例如数据库连接mybatis这些需要和配置文件交互或者Autowired的不建议进行混淆,可以通过ignore-classes进行屏蔽
3)对于混淆来说,最好只混淆主要的逻辑,类似一些无脑的查库取库等一些简单的实现类不建议混淆
4)在进行mvn install时可能会出来单测失败的问题,这属于Spring启动问题,使用 mvn install -DskipTests