Spring Boot 项目代码混淆,实战来了,再也不用担心代码泄露了!

简介: Spring Boot 项目代码混淆,实战来了,再也不用担心代码泄露了!

编译

简单就是把代码跑一哈,然后我们的代码 .java文件 就被编译成了 .class 文件


f458fadea1089f8e727c9dbbf5c4f5bd_c34d7662c29a4beaab2baa16fe1a1f8a.png


反编译

就是针对编译生成的 jar/war 包 里面的 .class 文件 逆向还原回来,可以看到你的代码写的啥。


比较常用的反编译工具 JD-GUI ,直接把编译好的jar丢进去,大部分都能反编译看到源码:


045b51d907901de56c12e33dd74daddf_96ee0c0e68134632a63cc31b51f11c05.png


那如果不想给别人反编译看自己写的代码呢?


怎么做?


混淆

该篇玩的代码混淆 ,是其中一种手段。


我给你看,但你反编译看到的不是真正的代码。


先看一张效果示例图 :


b539076c49e0b68834bd156e17f1438d_7456170f9a884b45bf984465ef592ae0.png


开搞


正文

先看一下我们混淆一个项目代码,要做啥?


b02b584fe3154dd47277e86525312593_361e0ec638174e6895d1e8e19ebaf3f3.png


一共就两步

推荐一个开源免费的 Spring Boot 最全教程:


https://github.com/javastacks/spring-boot-best-practice


第一步, 在项目路径下,新增一份文件 proguard.cfg :


proguard.cfg


#指定Java的版本

-target 1.8

#proguard会对代码进行优化压缩,他会删除从未使用的类或者类成员变量等

-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 * {

                       @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

-keep public class com.example.myproguarddemo.MyproguarddemoApplication {

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

   }


注意点:


5726975777fc4616b5e9536e26767c95_d64e54ea53324dfdb4ddac5933001354.png


其余的看注释,可以配置哪些类不参与混淆,哪些枚举保留,哪些方法名不混淆等等。


第二步,在pom文件上 加入proguard 混淆插件 :


build标签里面改动加入一下配置:


<build>

   <plugins>

       <plugin>

           <groupId>com.github.wvengen</groupId>

           <artifactId>proguard-maven-plugin</artifactId>

           <version>2.6.0</version>

           <executions>

               <!-- 以下配置说明执行mvn的package命令时候,会执行proguard-->

               <execution>

                   <phase>package</phase>

                   <goals>

                       <goal>proguard</goal>

                   </goals>

               </execution>

           </executions>

           <configuration>

               <!-- 就是输入Jar的名称,我们要知道,代码混淆其实是将一个原始的jar,生成一个混淆后的jar,那么就会有输入输出。 -->

               <injar>${project.build.finalName}.jar</injar>

               <!-- 输出jar名称,输入输出jar同名的时候就是覆盖,也是比较常用的配置。 -->

               <outjar>${project.build.finalName}.jar</outjar>

               <!-- 是否混淆 默认是true -->

               <obfuscate>true</obfuscate>

               <!-- 配置一个文件,通常叫做proguard.cfg,该文件主要是配置options选项,也就是说使用proguard.cfg那么options下的所有内容都可以移到proguard.cfg中 -->

               <proguardInclude>${project.basedir}/proguard.cfg</proguardInclude>

               <!-- 额外的jar包,通常是项目编译所需要的jar -->

               <libs>

                   <lib>${java.home}/lib/rt.jar</lib>

                   <lib>${java.home}/lib/jce.jar</lib>

                   <lib>${java.home}/lib/jsse.jar</lib>

               </libs>

               <!-- 对输入jar进行过滤比如,如下配置就是对META-INFO文件不处理。 -->

               <inLibsFilter>!META-INF/**,!META-INF/versions/9/**.class</inLibsFilter>

               <!-- 这是输出路径配置,但是要注意这个路径必须要包括injar标签填写的jar -->

               <outputDirectory>${project.basedir}/target</outputDirectory>

               <!--这里特别重要,此处主要是配置混淆的一些细节选项,比如哪些类不需要混淆,哪些需要混淆-->

               <options>

                   <!-- 可以在此处写option标签配置,不过我上面使用了proguardInclude,故而我更喜欢在proguard.cfg中配置 -->

               </options>

           </configuration>

       </plugin>

       <plugin>

           <groupId>org.springframework.boot</groupId>

           <artifactId>spring-boot-maven-plugin</artifactId>

           <executions>

               <execution>

                   <goals>

                       <goal>repackage</goal>

                   </goals>

                   <configuration>

                       <mainClass>com.example.myproguarddemo.MyproguarddemoApplication</mainClass>

                   </configuration>

               </execution>

           </executions>

       </plugin>

   </plugins>

</build>


注意点:

ecd7c3efbcc197ee8d5b425ea7a600fa_454994a296174d76a871ecc89d38a601.png

bacc72bc93f19d4e7b05c242d314a149_366e30c950fb4f588f23cd2f849756a2.png

然后可以看到:


72180c7e0568487ba87db4d8e0bbfc59_d83fac999a9b44ce9ac3032c11a6ccce.png


然后点击package,正常执行编译打包流程就可以 :


23844b27268efada2a2caf477ce02d29_7dc63202a77540d8a05ca7c6010ee30a.png


然后可以看到jar的生成:


ca01c19549f52cc81e21ddf7ba975927_5c5b33bcf7b341d9a919bbc3a31de0af.png


看看效果:


20e145b35eef20ed455d63a7b4b60079_8d685eb69e9646639ef5b14889d639c3.png


好了,该篇就到这。


本文链接:https://blog.csdn.net/qq_35387940/article/details/127426354

————————————————

版权声明:本文为CSDN博主「Java技术栈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/youanyyou/article/details/130378425

相关文章
|
11月前
|
负载均衡 监控 Java
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
本文详细介绍了 Spring Cloud Gateway 的核心功能与实践配置。首先讲解了网关模块的创建流程,包括依赖引入(gateway、nacos 服务发现、负载均衡)、端口与服务发现配置,以及路由规则的设置(需注意路径前缀重复与优先级 order)。接着深入解析路由断言,涵盖 After、Before、Path 等 12 种内置断言的参数、作用及配置示例,并说明了自定义断言的实现方法。随后重点阐述过滤器机制,区分路由过滤器(如 AddRequestHeader、RewritePath、RequestRateLimiter 等)与全局过滤器的作用范围与配置方式,提
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
|
11月前
|
安全 Java 应用服务中间件
Spring Boot + Java 21:内存减少 60%,启动速度提高 30% — 零代码
通过调整三个JVM和Spring Boot配置开关,无需重写代码即可显著优化Java应用性能:内存减少60%,启动速度提升30%。适用于所有在JVM上运行API的生产团队,低成本实现高效能。
1166 3
|
10月前
|
人工智能 监控 Java
零代码改造 + 全链路追踪!Spring AI 最新可观测性详细解读
Spring AI Alibaba 通过集成 OpenTelemetry 实现可观测性,支持框架原生和无侵入探针两种方式。原生方案依赖 Micrometer 自动埋点,适用于快速接入;无侵入探针基于 LoongSuite 商业版,无需修改代码即可采集标准 OTLP 数据,解决了原生方案扩展性差、调用链易断链等问题。未来将开源无侵入探针方案,整合至 AgentScope Studio,并进一步增强多 Agent 场景下的观测能力。
3262 100
|
10月前
|
监控 Cloud Native Java
Spring Boot 3.x 微服务架构实战指南
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Spring Boot 3.x与微服务架构,探索云原生、性能优化与高可用系统设计。以代码为笔,在二进制星河中谱写极客诗篇。关注我,共赴技术星辰大海!(238字)
1439 2
Spring Boot 3.x 微服务架构实战指南
|
10月前
|
安全 Java 测试技术
《深入理解Spring》单元测试——高质量代码的守护神
Spring测试框架提供全面的单元与集成测试支持,通过`@SpringBootTest`、`@WebMvcTest`等注解实现分层测试,结合Mockito、Testcontainers和Jacoco,保障代码质量,提升开发效率与系统稳定性。
|
10月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
11月前
|
安全 IDE Java
Spring 的@FieldDefaults和@Data:Lombok 注解以实现更简洁的代码
本文介绍了如何在 Spring 应用程序中使用 Project Lombok 的 `@Data` 和 `@FieldDefaults` 注解来减少样板代码,提升代码可读性和可维护性,并探讨了其适用场景与限制。
363 0
Spring 的@FieldDefaults和@Data:Lombok 注解以实现更简洁的代码
|
12月前
|
人工智能 监控 安全
如何快速上手【Spring AOP】?核心应用实战(上篇)
哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。