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

news2024/10/7 4:32:28

编译

简单就是把代码跑一哈,然后我们的代码 .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/14029.html

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

相关文章

java项目-第144期ssm农产品供销服务系统-java毕业设计_计算机毕业设计

java项目-第144期ssm农产品供销服务系统-java毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm农产品供销服务系统》 该项目分为2个角色&#xff0c;管理员和用户。 用户可以浏览前台,包含功能有&#xff1a; 首页、农产品、农产品资讯、我的、跳转到后…

JavaScript DOM中获取元素、事件基础、操作元素、节点操作

目录 JavaScript事件三要素 常见的事件​编辑 2、执行事件的步骤&#xff1a; 1. 获取元素 1.1 方式 1.1.1 根据ID获取 1.1.2 根据标签名获取 1.1.3 通过html5新增的方法获取 1.1.4 特殊元素获取 2. 事件基础 2.1 事件三要素 2.1.1 事件源 2.1.2 事件类型 2.1.3…

如何使用Spring Security控制会话

在 Spring 安全教程的这篇文章中&#xff0c;我们将讨论Spring 安全会话管理。我们将讨论 Spring 安全性的独特功能&#xff0c;这有助于我们高效和安全的会话管理。 春季安全会议 本文将讨论安全会话管理以及 spring 安全性如何帮助我们控制 HTTP 会话。Spring 安全性使用以…

1.4_29 Axure RP 9 for mac 高保真原型图 - 案例28【中继器-后台管理系统6】功能-原位修改数据

相关链接 目录Axure中文学习网AxureShopAxureShop-QA 案例目标1. 了解使用中继器&#xff0c;弹窗修改数据的实现方式 一、成品效果 Axure Cloud 案例28【中继器 - 后台管理系统6】功能-原位修改数据 版本更新一、修改功能   1.1 文本框&#xff1a;点击数据位置&#xff…

InternImage

终于有对抗Transformer 的了~~ 来自浦江实验室、清华等机构的研究人员提出了一种新的基于卷积的基础模型&#xff0c;称为 InternImage&#xff0c;与基于 Transformer 的网络不同&#xff0c;InternImage 以可变形卷积作为核心算子&#xff0c;使模型不仅具有检测和分割等下游…

MySQL删除表数据总结(DELETE、TRUNCATE、DROP)

&#xff08;1&#xff09;当我们不再需要该表时&#xff0c;使用DROP&#xff0c;会连表一起删掉&#xff0c;无法找回。速度很快。 DROP TABLE web_tbl_search;&#xff08;2&#xff09;保留表结构&#xff0c;只删除表数据&#xff0c;使用TRUNCATE&#xff0c;数据删除后…

【unCloud】在使用uni-admin时遇到的问题(原uniCloud-admin)

目录一、前言二、遇到的几个小问题问题一&#xff1a;可登录应用解决方法、步骤一、前言 这是我跟着官方的教学视频学习时遇到的一切小问题&#xff0c;由于我是初学&#xff0c;也没什么很多Vue一类的基础&#xff0c;所以学起来可能才会觉得这些是问题&#xff0c;但是也暂做…

得物视频编辑工具优化全指南

一、背景介绍 随着5G网络的推广和网络带宽的提升&#xff0c;视频成为互联网用户主要的消费载体&#xff0c;用户通过短视频来分享和浏览信息。由此视频的编辑功能越来越重要、越来越普遍。视频编辑的APP也如雨后春笋般涌现。 更好地推动得物App社区业务的发展&#xff0c;得…

测试日常工作中需要具备哪些知识和能力,在需求评审时需要考虑哪些方面,在技术方面评审时需要考虑哪些方面,从什么方面进行设计测试用例

前几天同事分享了一波作为测试需要具备哪些能力&#xff0c;测试用例需要从哪些方面进行设计&#xff0c;我把他分享的内容拷贝了一波&#xff0c;作为以后在测试过程中的参考。 首先需求评审、技术方案评审、测试用例评审三者的关系 一开始&#xff0c;我每次设计测试用例都是…

操作系统 | 实验八 文件管理

一、实验目的 掌握文件的存取方法&#xff1b;掌握文件的逻辑结构和物理结构&#xff1b;掌握存储空间的分配和回收&#xff1b;掌握磁盘管理与调度。 二、实验内容 用程序模拟磁盘的调度过程&#xff0c;并计算各磁盘调度算法包括先来先服务算法、最短寻道时间优先算法、扫…

【大根堆 Java】使用优先队列+HashMap 解决前 K 个高频元素问题

一、题目描述 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 二、思路 本题我们主要完成两个步骤&#xff1a; 统计出每个元素出现的次数找出出现次数最多的前 K 个元素 对第一个步骤&#xf…

IPWorks S/MIME Delphi Edition

IPWorks S/MIME是一套用于电子邮件加密和文档安全的综合组件。IPWorks S/MIME使用公钥密码标准&#xff08;PKCS&#xff09;实现加密和解密的S/MIME标准。 IPWorks S/MIME包括通用的S/MIME组件以及支持S/MIME的IPWorks POP3、IMAP、SMTP、FileMailer和HTMLMailer组件版本。还…

【MMDet】提交PR的学习笔记

官方文档 关于如何向MMDet提交PR&#xff0c;请参考mmcv的文档《拉取请求 — mmcv 1.6.1 文档》 1. Fork最新代码库 当第一次提PR时&#xff0c;需要复刻OpenMMLab代码库&#xff0c;点击 GitHub 页面右上角的Fork按钮即可 将复刻的代码库克隆到本地 git clone fork_mmdet…

trunc函数与truncate函数的一点区别

Oracle的trunc函数与truncate函数都可以对数值进行截取操作 -- 首先看对数值进行截取操作 SELECT TRUNCATE(122.123, 4) from dual; # 122.123 SELECT TRUNCATE(122.123, 3) from dual; # 122.123 SELECT TRUNCATE(122.123, 2) from dual; # 122.12 SELECT TRUNCATE(122.123, 1…

vue3中使用element plus

1、先安装node.js node.js的安装_西瓜君的代码的博客-CSDN博客 2、安装vue-cli vue-cli的安装_西瓜君的代码的博客-CSDN博客 3、安装element-plus Element UI 安装_西瓜君的代码的博客-CSDN博客 4、idea中使用vue3 在idea中使用vue3_西瓜君的代码的博客-CSDN博客 5、 加入 impo…

分享从零开始学习网络设备配置--2.5 提高骨干链路带宽(链路聚合)

任务描述 某公司的网络中心为了接入网络稳定性&#xff0c;在汇聚层交换机的连接连路上使用了多条冗余链路&#xff0c;同时&#xff0c;为了增加带宽&#xff0c;多条冗余链路之间实现端口聚合&#xff0c;提高骨干链路的带宽&#xff0c;这样可以实现链路之间的冗余和备份效果…

Node.js v19,它来了。详解 6 大特性

通译自&#xff1a;6 Major Features of Node.js 19. Details of Node.js 19 new features… | by Jennifer Fu | Oct, 2022 | Better Programming Node 19 在 2022-10-18 发布。 我们知道 Node.js 版本分两种&#xff1a;LTS 和 Current 其中&#xff0c;Current 版本通常每 …

C语言第十课(下):优化井字棋游戏

目录 前言&#xff1a; 一、优手着棋判定&#xff1a; 1.防守型着棋优化&#xff1a; 2.进攻型着棋优化&#xff1a; 二、界面格式优化&#xff1a; 1.Sleep休眠语句&#xff1a; 2.system语句&#xff1a; 三、优化后最终全部代码&#xff1a; 1.头文件game.h: 2.函数功能…

MFIF:Deep Regression Pair Learning

DRPL: Deep Regression Pair Learning for Multi-Focus Image Fusion 本文提出了一种用于多焦点图像融合的新型深度网络&#xff0c;称为深度回归对学习 (DRPL)。与现有的深度融合方法将输入图像分割成小的补丁并应用分类器来判断补丁是否聚焦相比&#xff0c;DRPL直接将整个图…

java springboot获取GitLab上的文件内容

这里以最简单的方式获取git上的文件,并读取文件 第一步:获取主域名host 进入网页版的git,链接为:https://gitlab.***.com 第二步:获取access_token 在git网页端登录后的右上角用户头像下拉菜单的settings页面===>再点击settings页面的左侧菜单栏中的Access Tokens选…