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

[转]java代码混淆以及及IDEA中springboot使用Allatori进行混淆相关推荐

  1. java数组个数无限_基于Java代码实现数字在数组中出现次数超过一半

    下文通过几种方法给大家介绍java数组数字出现次数,具体内容如下所示: 方法一: 数组排序,然后中间值肯定是要查找的值. 排序最小的时间复杂度(快速排序)O(NlogN),加上遍历. 方法二: 使用散 ...

  2. java weka命令行_使用自己的Java代码和模型获取WEKA中的预测百分比

    概观 我知道可以通过GUI和命令行选项在训练有素的WEKA模型中获得每个预测的百分比,如文档文章"Making predictions"中所方便解释和演示的那样. 预测 我知道有三 ...

  3. amd cpu不能在cmd环境下运行java代码_如何在Windows10中配置java的JDK环境

    今天给大家分享一下如何配置java的JDK环境.操作步骤如下: 1.下载好 jdk 的安装文件,我下载的是 jdk-10.0.1_windows-x64_bin.exe 这个版本的安装文件: 2.使用 ...

  4. java代码获取项路径_Java中获取各种路径的方法盘点

    Java代码中获取路径 假设当前项目路径为:D:/wunian/workspace/JavaProject,现在来分别获取此项目中的各种路径. 1.获取资源文件(.class文件)所在路径(四种方式) ...

  5. 各种存储分配算法java代码实现_Java实现操作系统中四种动态内存分配算法:BF+NF+WF+FF...

    1 概述 本文是利用Java实现操作系统中的四种动态内存分配方式 ,分别是:BF NF WF FF 分两部分,第一部分是介绍四种分配方式的概念以及例子,第二部分是代码实现以及讲解. 2 四种分配方式 ...

  6. java代码二进制转为十六进制_Java 中二进制转换成十六进制的两种实现方法

    Java 中二进制转换成十六进制的两种实现方法 每个字节转成16进制,方法1 /** * 每个字节转成16进制,方法1 * * @param result */ private static Stri ...

  7. java代码的运行顺序_java中的代码块执行顺序

    输入代码 blic static void main(String[] args) { { int x = 10;//限定变量的声明周期 System.out.println(x); } Studen ...

  8. java代码加载_java类中代码加载顺序

    package org.senssic; /** * 一般顺序:静态块-->静态变量-->成员变量-->构造方法-->静态方法(或非静态方法,需要调用) * 1.静态代码块(只 ...

  9. 打地鼠java代码流程图_51单片机 普中51 打地鼠游戏 仿真 程序 流程图

    51单片机 普中51 打地鼠游戏 仿真 程序 流程图 51单片机 普中51 打地鼠游戏 仿真 程序 流程图 普中51-单核-A3&A4开发板原理图 用到数码管.LED.矩阵按键 描述: (1) ...

  10. Java代码实现三维立体空间中两点距离的求解

    资源下载地址:https://download.csdn.net/download/sheziqiong/86763912 资源下载地址:https://download.csdn.net/downl ...

最新文章

  1. 自动化监控--zabbix中的邮件报警通知详解
  2. Python关于中文字符前面的u(转载)
  3. kodi资源_kodi 展示播放 NAS 电影
  4. C#驱动级模拟按键操作
  5. kafka性能高的影响因素
  6. 开源GIS(十五)——openlayers通过geoserver中WFS删除要素
  7. 在哪里学python-深圳学python人工智能培训去哪里
  8. 批量实现 cv2.cvtColor(images, cv2.COLOR_GRAY2RGB)
  9. Visual studio code清除终端数据
  10. 天涯明月刀大地的服务器位置,天涯明月刀东海玉涡位置坐标指南[图]
  11. 三菱Q系列ST、结构化编程、QD77定位以及转矩模式切换案例
  12. 实战OpenPose项目1:开篇使用文档
  13. 基于arduino的WiFi无线传输
  14. 已解决:[emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forb
  15. 请不要再轻视Git —— 我在工作中是如何使用 Git 的
  16. pdf编辑软件哪个好?编辑pdf的软件分享一款,像word一样好用!
  17. BLE MESH组网(七)真机配置
  18. 利用telnet连接远程服务器端
  19. c语言自动贩卖机设计报告,自动贩卖机课程设计.doc
  20. 介绍python库的书籍_【介】 介怎么读|组词|读音|拼音|多音字|意思 - 辞海之家

热门文章

  1. 点分十进制IP转换为32位二进制IP,带合法性校验
  2. 灌浆料的弹性模量计算_高强无收缩灌浆料弹性模量
  3. firefly-rk3288开发板Linux驱动——W25Q32 SPI驱动
  4. 生信技能树课程记录笔记(一)20220523
  5. 拦截器和过滤器的执行顺序和区别
  6. ws2812 c语言程序,STC15单片机驱动WS2812B七彩LED(汇编混合编程)
  7. 在文档阅读器上为 PDF 文档生成多级目录
  8. 神经元模型图手工制作,神经元模型图手工模型
  9. 夜场票为何一票难求?故宫院长在彩排现场解答观众
  10. 随机梯度下降SGD算法理解