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

相关文章
|
12天前
|
Java 应用服务中间件
SpringBoot获取项目文件的绝对路径和相对路径
SpringBoot获取项目文件的绝对路径和相对路径
49 1
SpringBoot获取项目文件的绝对路径和相对路径
|
3天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
11 2
|
7天前
|
分布式计算 关系型数据库 MySQL
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型 图像处理 光通信 分布式计算 算法语言 信息技术 计算机应用
27 8
|
29天前
|
设计模式 前端开发 Java
Spring MVC——项目创建和建立请求连接
MVC是一种软件架构设计模式,将应用分为模型、视图和控制器三部分。Spring MVC是基于MVC模式的Web框架,通过`@RequestMapping`等注解实现URL路由映射,支持GET和POST请求,并可传递参数。创建Spring MVC项目与Spring Boot类似,使用`@RestController`注解标记控制器类。
34 1
Spring MVC——项目创建和建立请求连接
|
12天前
|
缓存 监控 Java
|
14天前
|
JavaScript 前端开发 Java
SpringBoot项目的html页面使用axios进行get post请求
SpringBoot项目的html页面使用axios进行get post请求
38 2
|
14天前
|
前端开发 Java Spring
SpringBoot项目thymeleaf页面支持词条国际化切换
SpringBoot项目thymeleaf页面支持词条国际化切换
42 2
|
14天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
28 1
|
16天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
22天前
|
自然语言处理 Java API
Spring Boot 接入大模型实战:通义千问赋能智能应用快速构建
【10月更文挑战第23天】在人工智能(AI)技术飞速发展的今天,大模型如通义千问(阿里云推出的生成式对话引擎)等已成为推动智能应用创新的重要力量。然而,对于许多开发者而言,如何高效、便捷地接入这些大模型并构建出功能丰富的智能应用仍是一个挑战。
89 6