当前位置: 首页 > news >正文

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

目录

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.lryc.cn/news/464908.html

相关文章:

  • Axios 基本使用
  • 前端大佬都在用的actionDelegationMiddleware究竟有多香?
  • 解决k8s集群中安装ks3.4.1开启日志失败问题
  • Qml-Item的Id生效范围
  • 【配色网站分享】
  • 【记录】Android|安卓平板 猫游戏(四款,peppy cat,含下载教程和链接)
  • 微前端架构及其解决方案对比
  • git add操作,文件数量太多卡咋办呢,
  • 搭建Golang gRPC环境:protoc、protoc-gen-go 和 protoc-gen-go-grpc 工具安装教程
  • Spring Boot 核心理解-自动装配
  • go 中指针的执行效率比较
  • 单链表的经典算法OJ
  • 视频网站开发:Spring Boot框架的高效实现
  • 【前端】如何制作一个自己的网站(11)
  • 【Conda】提高 Conda 下载速度与兼容性的完美指南
  • 【Flutter】页面布局:层叠布局(Stack、Positioned)
  • SpringBoot实现的汽车票在线预订系统
  • 集合框架14:TreeSet概述、TreeSet使用、Comparator接口及举例
  • uniapp获取底部导航tabbar的高度(H5)
  • 接口测试 —— 如何测试加密接口?
  • 033 商品搜索
  • 身份证二要素实名认证接口-身份证核验接口-身份证实名API
  • 一次恶意程序分析
  • Javaweb基础-vue
  • 2. MySQL数据库基础
  • java集合进阶篇-《泛型》
  • pytorh学习笔记——cifar10(三)模仿VGGNet创建卷积网络
  • 题目:连续子序列
  • 深入解析:Nacos AP 模式的实现原理与应用场景
  • snmpnetstat使用说明