Spring boot使用ProGuard实现代码混淆
创始人
2024-01-31 21:32:54

目录

  • 参考
  • 一、 ProGuard简介
  • 二、混淆配置要点
  • 三、快速开始
    • 方案一 配置文件
      • 新增proguard.cfg
      • 配置插件
        • 打包
    • 方案二 pom中定义配置

参考

Spring boot使用ProGuard实现代码混淆
SpringBoot 玩一玩代码混淆,防止反编译代码泄露

代码混淆常见于安卓的apk安装文件, 服务端的代码因为不易被普通用户接触到, 所以混淆不多。但是某些场景下, 比如:项目需要部署到客户机器上, 就会有泄露代码逻辑的风险。
不过需要知道的是:使用proguard混淆代码只能增加阅读和理解的难度, 并不能百分百保证代码安全。也即是达到让开发人员看到这头痛的代码有99.99999%的冲动放弃阅读,拍桌子说还不如我重写一遍逻辑。

一、 ProGuard简介

附:proGuard官网

因为Java代码是非常容易反编译,况且Springboot和Android开发的应用程序都是用Java代码写的,为了很好的保护Java源代码,我们需要对编译好后的class文件进行混淆。

ProGuard是一个混淆代码的开源项目,它的主要作用是混淆代码,殊不知ProGuard还包括以下4个功能:

压缩(Shrink):检测并移除代码中无用的类、字段、方法和特性(Attribute)。
优化(Optimize):对字节码进行优化,移除无用的指令。
混淆(Obfuscate):使用a,b,c,d这样简短而无意义的名称,对类、字段和方法进行重命名。
预检(Preveirfy):在Java平台上对处理后的代码进行预检,确保加载的class文件是可执行的。

二、混淆配置要点

建议逐个java包定义混淆规则,这样思路更清晰 ;

  • repository(dao)层需要保存包名和类名,因为Mybatis的xml文件中引用了dao层的接口 ;
  • controller层注意在使用@PathVariable、@RequestParam时需要显式声明参数名 ;
  • dao层用于映射数据库表的类和controller层映射前台参数的类,都需要保留类成员 ;
  • 修改spring的bean命名策略,改成按类的全限定名来命名。
  • -entity和dto中的字段要保留命名,否则无法执行拷贝动作
  • -service最好用@Service(“xxxService”)指定名字,否则会模糊成a,导致依赖问题
    • 多模块依赖的模块最好不要模糊,否则无法依赖正常

混淆的大概效果图
在这里插入图片描述

三、快速开始

本文基于springboot2.x + maven + proguard进行代码混淆。

proguard是最为广为使用的工具之一,可是用他的客户端方式来混淆springboot项目的时候最后总得不到可执行的jar。后来发现了proguard-maven-plugin这个插件,所有proguard的指令都可以在pom中定义实现,本文采用proguard-maven-plugin方案。

方案一 配置文件

新增proguard.cfg

#指定Java的版本
-target 1.8
#proguard会对代码进行优化压缩,他会删除从未使用的类或者类成员变量等,shrink这个功能一般最好别用,所以这里添加了,我就遇到过启动jar的时候不支持压缩jar的问题
-dontshrink
#是否关闭字节码级别的优化,如果不开启则设置如下配置
-dontoptimize
#混淆时不生成大小写混合的类名,默认是可以大小写混合
-dontusemixedcaseclassnames
# 对于类成员的命名的混淆采取唯一策略
-useuniqueclassmembernames
#混淆时不生成大小写混合的类名,默认是可以大小写混合
-dontusemixedcaseclassnames
#混淆类名之后,对使用Class.forName('className')之类的地方进行相应替代
-adaptclassstrings#对异常、注解信息予以保留
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
# 此选项将保存接口中的所有原始名称(不混淆)-->
-keepnames interface ** { *; }
# 此选项将保存所有软件包中的所有原始接口文件(不进行混淆)
#-keep interface * extends * { *; }
#保留参数名,因为控制器,或者Mybatis等接口的参数如果混淆会导致无法接受参数,xml文件找不到参数
-keepparameternames
# 保留枚举成员及方法
-keepclassmembers enum * { *; }
# 不混淆所有类,保存原始定义的注释-
-keepclassmembers class * {@com.baomidou.mybatisplus.annotation *;@org.springframework.context.annotation.Bean *;@org.springframework.beans.factory.annotation.Autowired *;@org.springframework.beans.factory.annotation.Value *;@org.springframework.stereotype.Service *;@org.springframework.stereotype.Component *;}#忽略warn消息
-ignorewarnings
#忽略note消息
-dontnote
#打印配置信息
-printconfiguration
# 不混淆controller入口类
-keep class com.edevp.modules.store.dto.*
-keep class com.edevp.modules.**.*Impl
-keep class com.edevp.modules.store.web.* {*;}
-keep class com.edevp.modules.store.entity.* {*;}
-keep public class com.edevp.modules.store.StoreApplication {public static void main(java.lang.String[]);}

下面这些代码是用来指定哪些包不被混淆,注意将包路径改为你自己的








 

对应配置文件方式:

# 不混淆controller入口类
-keep class com.edevp.modules.store.dto.*
-keep class com.edevp.modules.**.*Impl
-keep class com.edevp.modules.store.web.* {*;}
-keep class com.edevp.modules.store.entity.* {*;}
-keep public class com.edevp.modules.store.StoreApplication {public static void main(java.lang.String[]);}

说明:
-keep class 类/包.** 表示保留类名;
-keepclassmembers class 类/包.**{ *;} 表示保留类下边的所有变量,均不混淆。

配置插件

在pom.xml中配置插件

com.github.wvengenproguard-maven-plugin2.6.0packageproguard${project.build.finalName}.jar${project.build.finalName}.jartrue${project.basedir}/proguard.cfg${java.home}/lib/rt.jar${java.home}/lib/jce.jar${java.home}/lib/jsse.jar!META-INF/**,!META-INF/versions/9/**.class${project.basedir}/targetorg.springframework.bootspring-boot-maven-plugin2.6.8repackagecom.edevp.modules.store.StoreApplication

在这里插入图片描述

打包

然后点击package,正常执行编译打包流程就可以 :
在这里插入图片描述
打包之后
在这里插入图片描述

在target目录下会生成5个文件:

jpa-0.0.1-SNAPSHOT.jar混淆后的Spring boot
jar,里面包含完整的项目结构,可以运行,这个就是我们本文的产出物; proguard_map.txt 混淆内容的映射;
proguard_seed.txt 参与混淆的类; 还有2个未混淆的原始jar包。

反编译
在这里插入图片描述

方案二 pom中定义配置


4.0.0com.erbadagang.data.jpajpa0.0.1-SNAPSHOTjpaJPA project for Spring Boot1.8UTF-8UTF-82.3.0.RELEASEorg.springframework.bootspring-boot-starter-data-jdbcorg.springframework.bootspring-boot-starter-data-jpamysqlmysql-connector-javaruntimeorg.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-testtestorg.junit.vintagejunit-vintage-engineorg.projectlomboklombok1.18.12org.springframework.bootspring-boot-dependencies${spring-boot.version}pomimportorg.apache.maven.pluginsmaven-compiler-plugin1.81.8UTF-8com.github.wvengenproguard-maven-plugin2.2.0packageproguard${project.build.finalName}.jar${project.build.finalName}.jartrue   ${java.home}/lib/rt.jar${java.home}/lib/jce.jarnet.sf.proguardproguard-base6.1.1org.springframework.bootspring-boot-maven-pluginrepackagecom.erbadagang.data.jpa.JpaApplication

相关内容

热门资讯

应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
每逢佳节倍思亲的意思 每逢佳节... 朴素,是诗歌语言众多风格之一。所谓“朴素”,即通过简洁、准确的语言传达作者真挚、美好的情感。如李白的...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...