SpringBoot3 JDK17集成proguard实现混淆打包

集成Maven,打包时自动混淆(推荐)

proguard提供了Maven插件,集成到Maven中,项目打包时自动进行混淆,方便快捷

局限性

Proguard本质上是通过读取jar,根据规则生成混淆映射,重写源码后输出jar,所以对于单模块的打包混淆比较友好,配置简单,

但是多模块项目下打包混淆就比较困难,涉及到多模块依赖的问题,如A模块方法签名xxxService.save,混淆后变成a.c,

不要对各子模块单独混淆。应在最终聚合模块的 package 阶段,将所有子模块 JAR 作为 -injars 输入,

统一执行一次 ProGuard。跨模块公共 API(接口、DTO)通过 -keep 保留,内部实现类正常混淆。

1.项目架构

JDK17, SpringBoot3,单模块

2.Pom

这里的插件顺序很重要,不能更改,proguard需要先读取无任何lib依赖的thin jar,输出混淆后的thin jar,

最后通过spring-boot-maven-plugin repackage,输出可执行的springboot fat jar,

如果直接使用spring-boot-maven-plugin打包出fat jar,proguard混淆输出后的包结构将被破坏,导致无法启动,摸索了好久才找到这个问题
xxxx..... {project.artifactId}-{version} org.apache.maven.plugins maven-jar-plugin {apache.maven.version} default-jar none create-thin-jar prepare-package jar com.github.wvengen proguard-maven-plugin {proguard.version} prepare-package proguard {project.build.finalName}.jar {project.build.finalName}.jar proguard-rules.pro false {java.home}/lib/jrt-fs.jar com.guardsquare proguard-base {proguard.base.version} org.springframework.boot spring-boot-maven-plugin com.换成你自己的启动类包名.XXXApplication package repackage 3.proguard混淆规则配置文件 根目录新建文件proguard-rules.pro, 名字可以自定义,跟上面Maven的proguardInclude对应即可 根据自己的项目包名结构,修改一下下面的保留规则

==========================================

1. 基础 Java 设置

==========================================

关闭 shrink(删除未用代码),Spring Boot 自动装配会有很多看似未用的类,删除必报错

-dontshrink

关闭 optimize(优化),JDK 17 配合 Spring Boot 优化极易引发类转换异常

-dontoptimize

忽略警告(第三方库经常会产生一些无害的警告,不忽略会导致打包中断)

-dontwarn

保留源文件名和行号,方便线上出Bug时根据异常栈反混淆查找问题

-keepattributes SourceFile,LineNumberTable

保留签名(泛型信息),MyBatis-Plus 和 HAPI 强依赖泛型反射

-keepattributes Signature

保留注解

-keepattributes Annotation

保留内部类、封闭类(JDK 17 新特性支持)、异常信息

-keepattributes InnerClasses,EnclosingMethod,PermittedSubclasses,Exceptions

==========================================

2. 启动类保留

==========================================

-keep public class com.换成你自己的包名.xxxApplication {

public static void main(java.lang.String\[\]);

}

==========================================

3. Spring Boot 核心保留规则

==========================================

-keep @org.springframework.stereotype.* class *

-keep @org.springframework.context.annotation.Configuration class *

-keep @org.springframework.boot.context.properties.ConfigurationProperties class * { ; }
-keep @org.springframework.web.bind.annotation.
class *

-keep @org.springframework.boot.autoconfigure.SpringBootApplication class *

只保留带有这些"生命周期/注入"注解的方法名。

其他没有注解的 public/private 方法,将被 ProGuard 混淆

-keepclassmembers class * {

@org.springframework.beans.factory.annotation.Autowired *;

@org.springframework.beans.factory.annotation.Value *;

@javax.inject.Inject *;

@org.springframework.context.annotation.Bean *;

@org.springframework.transaction.annotation.Transactional *;

@org.springframework.scheduling.annotation.Scheduled ;
@org.springframework.web.bind.annotation.
*;

@jakarta.annotation.PreDestroy *;

@jakarta.annotation.PostConstruct *;

}

==========================================

4. MyBatis-Plus 保留规则

==========================================

保留 MyBatis-Plus 自身代码

-keep class com.baomidou.mybatisplus.** { *; }

保留 MyBatis 核心代码

-keep class org.apache.ibatis.** { *; }

实体类:绝对不能混淆,否则 MyBatis 无法将数据库字段映射到对象

-keep class com.换成你自己的包名.entity.** { ; }
-keep class com.换成你自己的包名.domain.
* { ; }
-keep class com.换成你自己的包名.model.
* { *; }

DTO / VO:如果用在了接口返回值,建议不混淆,否则前端接收到的 JSON key 会变成 a, b, c

-keep class com.换成你自己的包名.dto.** { ; }
-keep class com.换成你自己的包名.vo.
* { *; }

Mapper 接口:动态代理需要,不能混淆

-keep interface com.换成你自己的包名.mapper.** { *; }

==========================================

5. 其他通用 Java 库保留

==========================================

序列化相关

-keep class * implements java.io.Serializable { *; }

枚举类(MyBatis-Plus 处理枚举需要)

-keepclassmembers enum * {

public static **\[\] values();

public static ** valueOf(java.lang.String);

}

Jackson 序列化/反序列化(Spring Boot 默认 JSON 库)

-keep class com.fasterxml.jackson.** { ; }
-keepclassmembers class * {
@com.fasterxml.jackson.annotation.
*;

}

  1. 反编译查看打包结果

推荐使用进行jd-gui反编译, 轻量化且方便

可以看到配置了保留规则的包和类进行了保留,其他类则都被混淆

image

image

相关推荐
AOwhisky1 小时前
Linux(CentOS)系统管理入门笔记(第二十一期)——防火墙管理(Firewalld)——zone、服务端口、富规则与端口转发
linux·运维·笔记·安全·centos·防火墙
外滩运维专家8 小时前
HTTPS 证书报错排查手册:6 个高频错误码及解决方法
网络协议·http·https
笨鸟先飞,勤能补拙8 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
加密狗复制模拟8 小时前
使用x64dbg进行超级狗super dog 加密狗逆向分析复制 超级狗克隆备份
安全·软件工程·个人开发·同态加密
ZeroNews内网穿透9 小时前
内网部署企业知识库,通过 HTTPS 隧道实现异地安全访问
安全·内网穿透
起司喵喵9 小时前
通过Certbot自动申请更新HTTPS网站的SSL证书
网络协议·https·ssl
笨鸟先飞,勤能补拙10 小时前
AI 赋能网络安全领域深度剖析
网络·人工智能·windows·安全·web安全·网络安全·github
HackTwoHub11 小时前
轻量化AI渗透武器库|ARTEX自主攻防系统、资产梳理、漏洞挖掘、链路分析全流程智能化落地
人工智能·安全·web安全·网络安全·系统安全·网络攻击模型·安全架构
流浪法师1211 小时前
GA/T 2380-2026《信息安全技术 网络安全等级保护数据安全基本要求》深度解读
安全
BEOL贝尔科技14 小时前
样本安全存储中还有哪些重要因素需要考虑?如何设置样本安全?
人工智能·安全·数据分析