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

相关文章
|
7天前
|
Java 关系型数据库 MySQL
springboot项目集成dolphinscheduler调度器 实现datax数据同步任务
springboot项目集成dolphinscheduler调度器 实现datax数据同步任务
56 2
|
8天前
|
分布式计算 Java 大数据
springboot项目集成dolphinscheduler调度器 可拖拽spark任务管理
springboot项目集成dolphinscheduler调度器 可拖拽spark任务管理
35 2
|
1月前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
109 1
Spring boot 使用mybatis generator 自动生成代码插件
|
14天前
|
人工智能 NoSQL Java
Spring AI 项目介绍
Spring AI 是为 Java 开发者量身打造的 AI 应用开发框架,提供统一的 API 抽象层,支持多种 AI 模型和向量数据库,具备企业级特性和完整的 Spring 生态集成。
185 3
|
4天前
|
Java 应用服务中间件 Maven
第01课:Spring Boot开发环境搭建和项目启动
第01课:Spring Boot开发环境搭建和项目启动
|
5天前
|
安全 Java Nacos
0代码改动实现Spring应用数据库帐密自动轮转
Nacos作为国内被广泛使用的配置中心,已经成为应用侧的基础设施产品,近年来安全问题被更多关注,这是中国国内软件行业逐渐迈向成熟的标志,也是必经之路,Nacos提供配置加密存储-运行时轮转的核心安全能力,将在应用安全领域承担更多职责。
|
1月前
|
Cloud Native Java 微服务
Spring Boot 3.x 现代化应用开发实战技巧与最佳实践
本指南基于Spring Boot 3.x,融合微服务、云原生与响应式编程等前沿技术,打造现代化应用开发实践。通过构建智能电商平台案例,涵盖商品、订单、用户等核心服务,展示Spring WebFlux、OAuth 2.0认证、Spring Cloud Gateway路由、GraalVM原生编译等技术实现。同时提供Docker/Kubernetes部署方案及性能优化策略,助您掌握从开发到生产的全流程。代码示例详实,适合进阶开发者参考。
143 2
|
20天前
|
前端开发 Java API
酒店管理系统基于 JavaFX Spring Boot 和 React 经典项目重构实操
本文介绍了基于现代技术栈的酒店管理系统开发方案,整合了JavaFX、Spring Boot和React三大技术框架。系统采用前后端分离架构,JavaFX构建桌面客户端,React开发Web管理界面,Spring Boot提供RESTful API后端服务。核心功能模块包括客房管理和客户预订流程,文中提供了JavaFX实现的客房管理界面代码示例和React开发的预订组件代码,展示了如何实现客房信息展示、添加修改操作以及在线预订功能。
51 0
|
1月前
|
网络协议 Java
在SpringBoot项目中使用Netty实现远程调用
本文介绍了使用Netty解决网络连接性能问题的方法,重点讲解了Netty的NIO特性及其在SpringBoot中的应用。Netty作为高效的NIO框架,支持非阻塞IO,能通过单线程管理多个客户端连接,简化TCP/UDP套接字服务器开发。文章详细展示了Netty在SpringBoot中实现远程调用的过程,包括服务端与客户端代码实现、依赖配置及测试验证。通过示例代码,如`NettyServer`、`NettyClientUtil`等,清晰说明了Netty的工作原理和实际应用,解决了半包等问题,并提供了完整的测试结果。
154 3
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问