springboot如何进行混淆加密(proguard+xjar)

一、背景

项目组核心代码模块部署于用户服务器上,另外一家公司获取了该服务器的root密码,常规的通过配置环境变量来进行数据库加密处理的方式,直接甩jar包到服务器的方式,极有可能导致数据泄露和代码泄露。

二、代码混淆

1.常用的混淆工具

软件名称 推荐理由
Allatori Java Obfuscator 轻量级可集成在IDE工具中,通过配置文件引入使用
DashO for Android and Java 收费,可与eclipse集成,防止Java程序被逆向工程和篡改,还能压缩代码量
Zelix KlassMaster 能读取和修改Java类文件,可以运行在任何支持1.1.6版Java虚拟机的平台上。
Cinnabar Canner 通过创建一个原生Windows可执行文件(EXE文件)保护你的代码不被逆向工程反编译,这个可执行文件包含了你的应用程序类和资源的全部加密版本,只有在被JVM调用到内存中时才处于非加密状态
Jmangle Java类粉碎机 来阻止反编译Java程序,降低盗版的软件,开发者可用其粉碎类文件中的符号。
RetroGuard 通用的字节码混淆器,用来无缝融入你的日常构建和测试过程中,使得你辛苦编写宝贵的Java代码更加安全
JODE 含Java解码器和优化器的Java包
ProGuard 免费的 Java类文件的压缩,优化,混肴器。它删除没有用的类,字段,方法与属性。使字节码最大程度地优化,使用简短且无意义的名字来重命名类、字段和方法 。eclipse已经把Proguard集成在一起了。
Java 字节码操纵框架 ASM ASM 是一个 Java 字节码操纵框架。它可以直接以二进制形式动态地生成 stub 类或其他代理类,或者在装载时动态地修改类。ASM 提供类似于 BCEL 和 SERP 之类的工具包的功能,但是被设计得更小巧、更快速,这使它适用于实时代码插装

经过比对,最终选择了proguard,选择该工具主要有以下原因:

  • 支持pom内直接集成
  • 配置文件可以集成pom内,也可以单独配置
  • 有很多相关的博文介绍
  • 公司其他项目组有使用这个的经验

2.proguard实际配置

以springboot单体应用为例,在原有项目配置文件的基础上,需要修改 plugins的相关配置

  • 【可选】修改springboot的maven-plugin配置<

配置文件加密采用 Jasypt

参考配置:

[java-信息安全(十九)加密工具Jasypt](www.cnblogs.com/bjlhx/p/122…)

四、jar包加密

采用Xjar进行jar包加密,网上普遍使用自定义编译的方式进行配置,如果要简化的话,可以通过已生成的jar直接进行加密,以下方法不适用于springBoot+jpa(hibernate)技术研发的程序。

1.自定义编译

XJar: Spring-Boot JAR 包加密运行工具,避免源码泄露以及反编译

2.通过已有jar直接加密

1.github下载xjar demo,下载地址:github.com/yumingzhu/x…2.自己代码的pom同级目录下,新建文件夹(如xjarEncode),并将xjarDemo-1.0-SNAPSHOT.jar拷贝放进来3.编译已混淆的代码,pom.xml下命令窗口执行:mvn clean package -DskipTests4.在第2步新建的文件夹中创建bat脚本文件(如encode.bat),方便后续快速执行【123456】 自定义密码。根据自己的需要填写【targets-0.0.1-SNAPSHOT.jar】 maven打包生成的jar包名称【targets.jar】 目标jar包名称java -cp .\xjarDemo-1.0-SNAPSHOT.jar XjarDemo 123456 ..\target\targets-0.0.1-SNAPSHOT.jar .\targets.jar 5.执行1.windows执行方法java -jar xxx.jar 在弹出的窗口内输入第四步你设置的密码即可2.linux执行方法,新建 encode.key文件password: 123456hold: true 配置文件说明:| 参数名称 | 参数含义 | 缺省 | 说明 || — | — | — | — || password | 密码 | 无 | 密码字符串 || algorithm | 密钥算法 | AES | 支持JDK所有内置算法,如AES/DES || keysize | 密钥长度 | 128 | 根据不同算法选择不同秘钥长度 || ivsize | 向量长度 | 128 | 根据不同的算法选择不同的向量长度 || hold | 是否保留 | false | 读取后是否保留密钥文件,true/1/yes/y,代表读取后不进行删除 |3.修改启动脚本,添加 --xjar.keyfile=encode.key参数,如使用linux,推荐以下启动脚本,可实现启动/停止/重启操作#!/bin/bash################################################################## 作者:拾叁# 时间:2022-07-14# 用途:启动管理#################################################################if [ -f /etc/init.d/functions ]; then  . /etc/init.d/functionsfi​​################################################################## 定义变量################################################################## application nameSERVICE_NAME='自定义'SERVICE_PACKAGE="${SERVICE_NAME}.jar"# application pathSERVICE_PATH='自定义'​​​################################################################## 定义命令#################################################################function START_COMMAND(){    echo "${SERVICE_PATH}/${SERVICE_PACKAGE}"  java -Duser.timezone=Asia/Shanghai -Xms4g -Xmx4g -jar ${SERVICE_PATH}/${SERVICE_PACKAGE} --xjar.keyfile=encode.key  2>/dev/null 1>&2 &    if [[ $? -eq 0 ]]; then      action "${SERVICE_NAME} start successed" /bin/true    else      action "${SERVICE_NAME} start failed" /bin/false    fi}​function STOP_COMMAND(){    SERVICE_PID=`ps -ef | grep "${SERVICE_PACKAGE}" | grep -v 'grep' | awk '{print $2}'`    if [[ ${SERVICE_PID} == '' ]]; then      action "${SERVICE_NAME} is not running" /bin/false    else        kill -9 ${SERVICE_PID} >/dev/null 2>&1        if [[ $? -eq 0 ]]; then          action "${SERVICE_NAME} stop successed" /bin/true        else          action "${SERVICE_NAME} stop failed" /bin/false        fi    fi}​function STATUS_COMMAND(){    SERVICE_PID=`ps -ef | grep "${SERVICE_PACKAGE}" | grep -v 'grep' | awk '{print $2}'`    if [[ ${SERVICE_PID} == '' ]]; then      action "${SERVICE_NAME} is not running" /bin/false    else      action "${SERVICE_NAME} is running" /bin/true    fi}​​################################################################## 定义命令#################################################################case "$1" in    start)      START_COMMAND      ;;    stop)      STOP_COMMAND      ;;    restart|reload)      STOP_COMMAND      START_COMMAND      ;;  status)      STATUS_COMMAND      ;;  *)        echo "Usage: $0 {start|stop|restart|status|reload}"      ;;esac 4.将jar,encode.key,脚本文件拷贝到服务器相应目录5.执行sh xxx.sh restart五、前后对比效果

1.混淆前

springboot如何进行混淆加密(proguard+xjar)_第1张图片

2.混淆后

springboot如何进行混淆加密(proguard+xjar)_第2张图片

此时配置文件和ORM mybatis xml文件还未加密

springboot如何进行混淆加密(proguard+xjar)_第3张图片

3.加密后

springboot如何进行混淆加密(proguard+xjar)_第4张图片 springboot如何进行混淆加密(proguard+xjar)_第5张图片 springboot如何进行混淆加密(proguard+xjar)_第6张图片

六、参考

1.总结10款常用的加密混淆软件
2.细数常用的5款Java代码混淆器!
3.共有18款Java 代码混淆和加密开源软件
4.proguard官网
5.ProGuard 最全混淆规则说明
6.jar包 加密 ----xjar

你可能感兴趣的:(spring,boot,java,后端,spring,开发语言)