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

相关文章
|
3天前
|
Java Maven Android开发
微服务——SpringBoot使用归纳——Spring Boot开发环境搭建和项目启动
本文介绍了Spring Boot开发环境的搭建和项目启动流程。主要内容包括:jdk的配置(IDEA、STS/eclipse设置方法)、Spring Boot工程的构建方式(IDEA快速构建、官方构建工具start.spring.io使用)、maven配置(本地maven路径与阿里云镜像设置)以及编码配置(IDEA和eclipse中的编码设置)。通过这些步骤,帮助开发者顺利完成Spring Boot项目的初始化和运行准备。
19 0
微服务——SpringBoot使用归纳——Spring Boot开发环境搭建和项目启动
|
3天前
|
Java 测试技术 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
本课主要讲解Spring Boot项目中的属性配置方法。在实际开发中,测试与生产环境的配置往往不同,因此不应将配置信息硬编码在代码中,而应使用配置文件管理,如`application.yml`。例如,在微服务架构下,可通过配置文件设置调用其他服务的地址(如订单服务端口8002),并利用`@Value`注解在代码中读取这些配置值。这种方式使项目更灵活,便于后续修改和维护。
11 0
|
3天前
|
Java 微服务 Spring
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录——使用Logger在项目中打印日志
本文介绍了如何在项目中使用Logger打印日志。通过SLF4J和Logback,可设置不同日志级别(如DEBUG、INFO、WARN、ERROR)并支持占位符输出动态信息。示例代码展示了日志在控制器中的应用,说明了日志配置对问题排查的重要性。附课程源码下载链接供实践参考。
21 0
|
14天前
|
人工智能 自然语言处理 前端开发
Spring AI与DeepSeek实战二:打造企业级智能体
本文介绍如何基于Spring AI与DeepSeek模型构建企业级多语言翻译智能体。通过明确的Prompt设计,该智能体能自主执行复杂任务,如精准翻译32种ISO标准语言,并严格遵循输入格式和行为限制。代码示例展示了如何通过API实现动态Prompt生成和翻译功能,确保服务的安全性和可控性。项目已开源,提供更多细节和完整代码。 [GitHub](https://github.com/zlt2000/zlt-spring-ai-app) | [Gitee](https://gitee.com/zlt2000/zlt-spring-ai-app)
135 11
|
21天前
|
人工智能 Java API
Spring AI与DeepSeek实战一:快速打造智能对话应用
在 AI 技术蓬勃发展的今天,国产大模型DeepSeek凭借其低成本高性能的特点,成为企业智能化转型的热门选择。而Spring AI作为 Java 生态的 AI 集成框架,通过统一API、简化配置等特性,让开发者无需深入底层即可快速调用各类 AI 服务。本文将手把手教你通过spring-ai集成DeepSeek接口实现普通对话与流式对话功能,助力你的Java应用轻松接入 AI 能力!虽然通过Spring AI能够快速完成DeepSeek大模型与。
348 11
|
3天前
|
Java 数据库 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——指定项目配置文件
在实际项目中,开发环境和生产环境的配置往往不同。为简化配置切换,可通过创建 `application-dev.yml` 和 `application-pro.yml` 分别管理开发与生产环境配置,如设置不同端口(8001/8002)。在 `application.yml` 中使用 `spring.profiles.active` 指定加载的配置文件,实现环境快速切换。本节还介绍了通过配置类读取参数的方法,适用于微服务场景,提升代码可维护性。课程源码可从 [Gitee](https://gitee.com/eson15/springboot_study) 下载。
16 0
|
3天前
|
Java 微服务 Spring
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
在微服务架构中,随着业务复杂度增加,项目可能需要调用多个微服务。为避免使用`@Value`注解逐一引入配置的繁琐,可通过定义配置类(如`MicroServiceUrl`)并结合`@ConfigurationProperties`注解实现批量管理。此方法需在配置文件中设置微服务地址(如订单、用户、购物车服务),并通过`@Component`将配置类纳入Spring容器。最后,在Controller中通过`@Resource`注入配置类即可便捷使用,提升代码可维护性。
13 0
|
存储 缓存 NoSQL
Spring Boot2.5 实战 MongoDB 与高并发 Redis 缓存|学习笔记
快速学习 Spring Boot2.5 实战 MongoDB 与高并发 Redis 缓存
Spring Boot2.5 实战 MongoDB 与高并发 Redis 缓存|学习笔记
|
Java Go Nacos
3.10 Spring Cloud Gateway 实战接入 Nacos 服务 | 学习笔记
快速学习 3.10 Spring Cloud Gateway 实战接入 Nacos 服务 。
3.10 Spring Cloud Gateway 实战接入 Nacos 服务 | 学习笔记
|
Cloud Native Java 测试技术
3.9 Spring Cloud Gateway 微服务新网关实战| 学习笔记
快速学习 3.9 Spring Cloud Gateway 微服务新网关实战。
3.9 Spring Cloud Gateway 微服务新网关实战| 学习笔记

热门文章

最新文章