SpringBoot 玩一玩代码混淆,防止反编译代码泄露!

news2024/9/9 5:34:20

编译

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

反编译

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

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

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

怎么做?

混淆

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

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

先看一张效果示例图 :

开搞

正文

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

一共就两步

第一步, 在项目路径下,新增一份文件 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[]);
    }

注意点:

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

第二步,在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>

注意点:

然后可以看到:

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

然后可以看到jar的生成:

看看效果:

好了,该篇就到这。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/62343.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习 LSTM长短期记忆网络原理与Pytorch手写数字识别

深度学习 LSTM长短期记忆网络原理与Pytorch手写数字识别一、前言二、网络结构二、可解释性三、记忆主线四、遗忘门五、输入门六、输出门七、手写数字识别实战7.1 引入依赖库7.2 加载数据7.3 迭代训练7.4 数据验证八、参考资料一、前言 基本的RNN存在梯度消失和梯度爆炸问题&am…

毕业设计-基于机器视觉的深蹲检测识别-TensorFlow-opencv

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

LeetCode刷题复盘笔记—一文搞懂完全背包之377. 组合总和 Ⅳ问题(动态规划系列第十二篇)

今日主要总结一下动态规划完全背包的一道题目&#xff0c;377. 组合总和 Ⅳ 题目&#xff1a;377. 组合总和 Ⅳ Leetcode题目地址 题目描述&#xff1a; 给你一个由 不同 整数组成的数组 nums &#xff0c;和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的…

[附源码]计算机毕业设计基于web的羽毛球管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Python软件编程等级考试一级——20220915

Python软件编程等级考试一级——20220915理论单选题判断题实操第一题第二题理论 单选题 1、表达式len(“学史明理增信 &#xff0c;读史终生受益”) > len(" reading history will benefit you ")的结果是&#xff1f; A、0 B、True C、False D、1 2、表达…

SLMi333国内首款兼容光耦带DESAT保护功能的隔离式栅极驱动器

SLMi333国内首款兼容光耦带DESAT保护功能的隔离式栅极驱动器,内置快速去饱和&#xff08;DESAT&#xff09;故障检测功能&#xff0c;米勒钳位功能&#xff0c;漏极开路故障反馈&#xff0c;软关断功能以及可选择的自恢复模式&#xff0c;兼容光耦隔离驱动器&#xff0c;一款高…

安装mongodb6

一、安装mongodb6.0.2 1.官网下载社区版 https://www.mongodb.com/ 2.双击下载的文件&#xff0c;按步骤安装 选择custom 自定义安装 改一下安装地址&#xff0c;路径最好不要带空格 Install MongoD as a Service 作为服务方式安装 Run the service as Network Service…

SuperMap iClient for Leaflet对EPSG:4509图加载滑动查询

作者&#xff1a;John SuperMap iClient for Leaflet对EPSG:4509地图加载&滑动查询 在WebGIS开发使用中&#xff0c;我们会遇到地图显示不了&#xff0c;以及查询到数据显示不出的问题&#xff0c;因此本文就以EPSG:4509为例介绍该坐标系地图加载和查询。 1、EPSG:4509地图…

数据分析案例:基于水色图像的水质识别

大数据分析课程、大数据分析班、大数据案例等&#xff0c;围绕大数据展开讲解。 数据分析案例&#xff1a;基于水色图像的水质识别&#xff0c;通过学习本案例&#xff0c;可以掌握图像切割、特征提取、模型构建和模型评价的主要方法和技能&#xff0c;并为后续相关课程学习及将…

蚂蚁面试官:Zookeeper 的选举流程是怎样的?我当场懵逼了

​ 编辑切换为居中 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 面试经常会遇到面试官问 Zookeeper 的选举原理&#xff0c;我心想&#xff0c;问这些有啥用吗&#xff1f;又不要我造火箭&#xff01; 每次面试也只知道个大概&#xff0c;并没有深究…

分布式电源接入对配电网影响的研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

vue3 + element 从0到1搭建前端基础框架

一、框架搭建 框架代码 个人博客 往往从0到1开发项目时发觉无从下手&#xff0c;或者很可能一步一个坑&#xff0c;因为大多基础框架公司已经搭建完毕的&#xff0c;新加入的成员也都是在此基础上进行功能模块的拓展。网上也鲜有详尽的全流程参考&#xff0c;多是某个局部功能的…

【Vue】webpack的基本使用

✍️ 作者简介: 前端新手学习中。 &#x1f482; 作者主页: 作者主页查看更多前端教学 &#x1f393; 专栏分享&#xff1a;css重难点教学 Node.js教学 从头开始学习 ajax学习 文章目录webpack的学习目标前端工程化 小白眼中的前端开发 vs 实际的前端开发 什么是前端工程…

CISP考试大纲/范围

CISP考试主要是考CISP知识体系大纲&#xff0c;分别为信息安全保障、信息安全技术、信息安全管理、信息安全工程和信息安全标准法规这五大知识类&#xff0c;每个知识类根据其逻辑划分为多个知识体&#xff0c;每个知识体包含多个知识域&#xff0c;每个知识域由一个或多个知识…

Java项目:SSM失物招领管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 主要功能包括&#xff1a; 用户发布失物&#xff0c;或者招领失物&#xff0c;管理员对用户&#xff0c;失物信息进行增删改查。 环境需要 1…

新课程教学杂志新课程教学杂志社新课程教学编辑部2022年第19期目录

核心素养 核心素养视域下的历史教学设计——以“清朝君主专制的强化”为例 王威; 1-3 新中考背景下文本分析能力与核心素养的培育 黄嫄; 4-5《新课程教学》投稿&#xff1a;cn7kantougao163.com 基于核心素养的物理教学评价改良 李红; 6-7 初中语文综合性学习的…

Metabase学习教程:系统管理-6

Metabase可扩展性 扩展Metabase以支持更多人和数据库的最佳实践。 Metabase是一个可扩展的、经过实战的软件&#xff0c;被成千上万的公司用来提供高质量的自助服务分析。它通过水平扩展支持高可用性&#xff0c;而且它是开箱即用的高效工具&#xff1a;一台拥有4gb内存的单核…

vue.js axios 数据不刷新

getServerList(){axios.get(/server/showList).then(function(response){this.servers response.data // 不刷新console.log(response.data)}).catch(function (error) {console.log(error);}); } 打印this&#xff1a;this不是vue对象修改为&#xff1a;getServerList(){axi…

Mysql各种缓冲区的功能及之间的联系

buffer poolmysql数据存放在磁盘里面&#xff0c;如果每次查询都直接从磁盘里面查询&#xff0c;会影响性能&#xff0c;因此需要内存态缓存池。另外缓存池的淘汰机制不是基础LRU&#xff0c;而是是改进版LRU&#xff0c;防止大量临时缓存挤出热点数据。buffer pool读缓存分为老…

代码随想录算法训练营第五十三天| LeetCode1143. 最长公共子序列、LeetCode1035. 不相交的线、LeetCode53. 最大子数组和

一、LeetCode1143. 最长公共子序列 1&#xff1a;题目描述&#xff08;1143. 最长公共子序列&#xff09; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一…