如何防止SpringBoot中的jar反编译?解决相关报错及踩到的坑

news2024/10/21 6:34:21

目录

1. 面对的场景

2. 方案

2.1 使用代码混淆

2.2 JAR包加密

3. 项目操作

4. 启动方式

5. 踩到的各种坑

5.1 java -jar xxx-0.0.1-SNAPSHOT.jar 没有主清单属性

5.2 Caused by: java.lang.IllegalArgumentException: Unrecognized option: -pwd=fxw-jar


1. 面对的场景

        最近要将项目部署到其它公司的服务器上,但是呢,又不想要将自己的源码给泄露出去,要求对正式环境的启动包进行安全性的处理,从而防止客户直接通过反编译工具将代码给反编译出来,这里有两个方案。

2. 方案

2.1 使用代码混淆

使用代码混淆工具,如ProGuard、YGuard等,对Java字节码文件进行混淆。这些工具可以通过重命名类、方法、变量等,删除注释和空格,代码优化等操作来达到混淆的效果,增加反编译的难度。

  • 使用ProGuard时,需要在项目的pom.xml文件中添加相关依赖和插件配置,然后创建一个配置文件(如proguard-rules.pro),在其中指定需要保留的类或方法,以及需要排除的类或方法。
  • 使用YGuard时,同样需要在pom.xml中添加插件配置,并创建一个yguard.xml文件来指定加密规则。

在单模块中使用此方案的话,还算是简单,但是如今的项目基本上都是多模块的,一个模块依赖多个公共的模块,这样的话,使用此方案就得不偿失了,不仅用起来比较麻烦,而且各模块之间的调用在是否混淆时也是极容易出错。

2.2 JAR包加密

        今天我们着重来讲解一下使用ClassFinal对JAR文件进行加密。ClassFinal是一款Java class文件安全加密工具,支持直接加密jar包或war包,无需修改任何项目代码,兼容spring-framework,可避免源码泄漏或字节码被反编译。这样实现的效果就是class文件只能看到注解、方法名和参数,方法内容被清空。

3. 项目操作

        只需要在启动类的pom.xml文件中添加如下插件即可,但是这里有一个注意点:ClassFinal插件要放在spring-boot-maven-plugin插件的后面,否则不起作用。

<plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.zpark.app.StudentMApplication</mainClass>
                    <skip>false</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>net.roseboy</groupId>
                <artifactId>classfinal-maven-plugin</artifactId>
                <version>1.2.1</version>
                <configuration>
                    <password>fxw</password>              <!--启动密码,#为空-->
                    <excludes>org.spring</excludes>
                    <packages>${groupId}</packages>     <!--需要加密的包名,有多个使用逗号分隔-->
                    <cfgfiles>application.properties</cfgfiles>     <!--需要加密的配置文件,有多个使用逗号分隔-->
                    <libjars>hutool-all-5.8.26.jar</libjars>				<!--jar包lib目录下要加密的jar依赖,有多个使用逗号分隔-->
                    <code></code>                       <!--机器码,指定某个机器启动-->
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>classFinal</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        当使用maven工具栏内的install之后,target目录下的xxx-encrypted.jar就是加密之后的jar包了。

4. 启动方式

无密码启动:
java -javaagent:xxxxx-encrypted.jar -jar xxxxx-encrypted.jar

有密码启动:
java -javaagent:xxxxx-encrypted.jar='-pwd 密码' -jar xxxxx-encrypted.jar

一定一定要注意:-pwd之后是空格,并不是“=”号。如果是“=”号的话会出现报错,相关报错在文章末尾给大家总结出来。

5. 踩到的各种坑

5.1 java -jar xxx-0.0.1-SNAPSHOT.jar 没有主清单属性

        相信对于习惯了在IDEA等软件内启动项目的同学来说,很少会去在cmd内启动项目。我也一样,但是今天在学习对JAR包加密时,就遇到了这个报错。

首先先来说解决方案

如果你使用的框架是SpringBoot,你要先确保有这个插件(这个会自动检测主类):

<plugin>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

然后再观察标签内部如果还有内容的话,<skip>标签内一定要设置为false:

更改之后重写运行命令,成功启动项目:

为什么<skip>true</skip>会导致找不到主清单属性?

在Maven项目中,如果你使用了<skip>true</skip>配置在pom.xml文件中,这通常是用来跳过测试的。当遇到了“找不到主清单属性”的错误,这可能是因为在跳过测试的同时,一些必要的构建步骤(如生成MANIFEST.MF文件中的主类信息)没有被正确执行。因为这个插件是负责将你的项目打包成一个可以执行的JAR文件,其中包含了一个正确的清单文件等内容。

5.2 Caused by: java.lang.IllegalArgumentException: Unrecognized option: -pwd=fxw-jar

        这个报错信息的话就是之前提到的-pwd之后得是空格,而不是“=”号,我看了好多网上的资料都是写的 ‘-pwd=密码’,这样的话一运行就会发生如下报错。

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

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

相关文章

sql-labs靶场第十七关测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、寻找注入点 2、注入数据库 ①寻找注入方法 ②爆库&#xff0c;查看数据库名称 ③爆表&#xff0c;查看security库的所有表 ④爆列&#xff0c;查看users表的所有列 ⑤成功获取用户名…

STM32CubeMX【串口收发USART】

第一步&#xff0c;配置cubemx 配置好点右上角生成 第二步&#xff0c;串口方式 阻塞式发送 英文、中文正常、浮点有口 /* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();//配置完自动生成的 发送到串口助手上 while (1){/* USER CODE…

【计算机网络 - 基础问题】每日 3 题(五十)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…

有限状态机和抽象类多态

学习有限状态机的写法&#xff0c;我们会用一个抽象类继承的方法来写 首先&#xff0c;现在我们已经用过类的继承了&#xff0c;就是在我们敌人和野猪的这个代码当中&#xff0c; 我们打开野猪的代码&#xff0c;它继承了Enemy这个父类&#xff0c;所以可以遗传它父类当中所有…

线性代数基础02

目录 1.向量 1.1向量的定义 1.2向量的运算 1.2.1向量加法 1.2.2向量数乘 1.2.3向量点积 1.3矩阵的特征值和特征向量 1.4向量的模 1.4.1向量的模的定义 1.4.2向量的模的几何解释 1.4.3向量的模的性质 1.5向量的内积 1.5.1向量的内积的定义 1.5.2向量的内积的几何解…

【Linux】进程概念 PCB结构体 fork创建子进程

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;青果大战linux 总有光环在陨落&#xff0c;总有新星在闪烁 每日小感慨&#xff…

UDP/TCP协议详解

目录 一,自定义应用层协议: 1)xml 2),JSON 3),yml 4),google protobuffer 二,传输层UDP/TCP: UDP协议: TCP协议: TCP的核心机制一:确认应答 TCP核心机制二:超时重传 TCP核心机制三:连接管理 TCP核心机制四:滑动窗口 TCP核心机制五:流量控制 TCP核心机制六:拥塞控制…

c++ pdf文件提取txt文本示例

最近抽空采用之前封装的接口将pdf文件提取出txt文本&#xff0c;顺利完成&#xff0c;界面如下所示&#xff1a; 提起的效果如下所示&#xff1a; 输出的txt文本内容如下&#xff1a; 下载链接&#xff1a;https://download.csdn.net/download/u011269801/89905548

AI 3D拣选系统行业分析:物流行业是最主要的需求来源

AI 3D拣选系统是一种集成了先进传感技术、机器人技术和计算机视觉技术的自动化分拣解决方案。它能够在三维空间内快速、准确地识别和分拣各种形状、大小和材质的物品&#xff0c;大大提高了物流效率和准确性。该系统通过高精度的3D传感器和先进的视觉算法&#xff0c;能够实时捕…

【某农业大学计算机网络实验报告】实验五 TCP 运输连接管理

实验目的&#xff1a; 熟悉 TCP 通信的三个阶段&#xff1a;通过此次实验&#xff0c;结合理论课知识深入理解并熟悉 TCP 通信的三个主要阶段&#xff0c;即连接建立&#xff08;SYN-SYN&#xff09;&#xff0c;数据传输&#xff08;DATA&#xff09;&#xff0c;以及连接释放…

【论文速读】Prompt Tuning:The Power of Scale for Parameter-Effificient Prompt Tuning

arxiv&#xff1a;2104.08691v2 摘要 在这项工作中&#xff0c;我们探索了“prompt tuning&#xff08;提示调优&#xff09;”&#xff0c;这是一种简单而有效的机制&#xff0c;用于学习“soft prompts&#xff08;软提示&#xff09;”&#xff0c;以条件下冻结的语言模型…

Golang | Leetcode Golang题解之第485题最大连续1的个数

题目&#xff1a; 题解&#xff1a; func findMaxConsecutiveOnes(nums []int) (maxCnt int) {cnt : 0for _, v : range nums {if v 1 {cnt} else {maxCnt max(maxCnt, cnt)cnt 0}}maxCnt max(maxCnt, cnt)return }func max(a, b int) int {if a > b {return a}return …

矩阵matrix

点积 在 NumPy 中&#xff0c;dot 是矩阵或向量的点积&#xff08;dot product&#xff09;操作。 假设有两个向量a和 b&#xff0c;它们的点积定义为对应元素相乘&#xff0c;然后求和。公式如下&#xff1a; 例子&#xff1a; 点积的计算步骤是&#xff1a; 因此&#xf…

【动态规划】【路径问题】下降路经最小和、最小路径和、地下城游戏

4. 下降路径最小和 931. 下降路径最小和 算法原理 确定状态表示 dp[i][j] 表示&#xff1a;到达 [i, j] 位置&#xff0c;最小的下降路径 状态转移方程 dp[i][j] 从 [i-1, j-1] 到达 [i, j] > dp[i-1][j-1] m[i][j]从 [i-1, j] 到达 [i, j] > dp[i-1][j] m[i][j]从 …

leetcode_887_鸡蛋掉落___循序渐进的分析

分析&#xff1a;对于一组[n,k] 在一次尝试中选择了在dep层测试 其可以分为 如果在dep层炸了: 则变成了[dep-1,k-1]读作在dep-1层用k-1个鸡蛋来找鸡蛋的极限所需次数如果在dep层没炸: 则变成了[n-dep,k]读作在n-dep层用k个鸡蛋来找鸡蛋的极限所需次数可以发现这都是子问题的…

【Javaee】网络编程-TCP Socket

前言 前文中我们介绍了UDP Socket相关的构造方法和方法&#xff0c;并实现了UDP的回显服务器和客户端。 本篇将介绍TCP Socket&#xff0c;并使用TCP Socket api实现服务器和客户端的通信 一.TCP Socket的常见方法 1.ServerSocket ServerSocket是创建TCP服务端Socket的API …

线程池:高效管理并发任务的利器

线程池&#xff1a;高效管理并发任务的利器 什么是线程池&#xff1f; 线程池&#xff08;Thread Pool&#xff09;是Java并发编程中的一种设计模式&#xff0c;旨在通过重复利用线程资源&#xff0c;来提高程序执行效率。线程池的主要思想是提前创建一组可供使用的线程&#…

归一化输入

当输入的不同的特征取值范围差异过大&#xff0c;取得对应参数差别也会很大&#xff0c;在对参数进行优化的过程中&#xff0c;参数小的维度步长较小&#xff0c;参数大的维度步长较大&#xff0c;优化过程中路径曲折&#xff0c;将输入归一化&#xff0c;使特征取值范围差别小…

相控阵雷达电特性matlab模拟与仿真,带GUI界面,对比有限扫描阵,稀疏阵,多波束阵,共形阵等

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 相控阵雷达作为一种先进的雷达技术&#xff0c;具有高分辨率、多功能、快速扫描等优点&#xff0c;在军事和民用领域都有着广泛的应用。相控阵雷达的天线系统是其核心组成部分…

C#线性变换——缩放

前言&#xff1a; 大家好&#xff0c;我是上位机马工&#xff0c;硕士毕业4年年入40万&#xff0c;目前在一家自动化公司担任软件经理&#xff0c;从事C#上位机软件开发8年以上&#xff01;我们在C#开发中经常需要对平面中的坐标进行一些变换&#xff0c;比如缩放、旋转等&…