SpringBoot Jar 包加密防止反编译实战

今天给大家分享一个 SpringBoot 程序 Jar 包加密的方式,通过代码加密可以实现无法反编译。

应用场景就是当需要把公司的产品部署到友方公司或者其他公司时,可以防止客户直接反编译出来源码,大大提升代码的安全性。

版本

  • springboot 2.6.8
  • jdk8

一、proguard-maven-plugin

第一种方式就是使用代码混淆的方式,可以参考proguard-maven-plugin插件使用,因为配置复杂,用起来太麻烦,本文不做重点介绍。

https://github.com/wvengen/proguard-maven-plugin

二、classfinal-maven-plugin

第二种方式就是使用代码加密的方式,classfinal-maven-plugin方式比较简单,只需要在pom.xml文件中引入一个plugin,然后简单的修改几项配置即可使用。

这种方式不仅可以对代码进行加密,对配置文件application.ymllib 下的依赖也可以加密。

还可以指定机器运行程序

https://gitee.com/roseboy/classfinal

三、实战

下面我们实战一下,首先创建一个 SpringBoot 程序,在 pom.xml 中加入。

需要注意的是,该插件需要放到spring-boot-maven-plugin后面

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><!--1. 加密后,方法体被清空,保留方法参数、注解等信息.主要兼容swagger文档注解扫描2. 方法体被清空后,反编译只能看到方法名和注解,看不到方法体的具体内容3. 加密后的项目需要设置javaagent来启动,启动过程中解密class,完全内存解密,不留下任何解密后的文件4. 启动加密后的jar,生成xxx-encrypted.jar,这个就是加密后的jar文件,加密后不可直接执行5. 无密码启动方式,java -javaagent:xxx-encrypted.jar -jar xxx-encrypted.jar6. 有密码启动方式,java -javaagent:xxx-encrypted.jar='-pwd= 密码' -jar xxx-encrypted.jar--><groupId>net.roseboy</groupId><artifactId>classfinal-maven-plugin</artifactId><version>1.2.1</version><configuration><password>#</password><!-- #表示启动时不需要密码,事实上对于代码混淆来说,这个密码没什么用,它只是一个启动密码 --><excludes>org.spring</excludes><packages>${groupId}</packages><!-- 加密的包名,多个包用逗号分开 --><cfgfiles>application.yml,application-dev.yml</cfgfiles><!-- 加密的配置文件,多个包用逗号分开 --><libjars>hutool-all.jar</libjars> <!-- jar包lib下面要加密的jar依赖文件,多个包用逗号分开 --><code>xxxxx</code> <!-- 指定机器启动,机器码 --></configuration><executions><execution><phase>package</phase><goals><goal>classFinal</goal></goals></execution></executions></plugin></plugins></build>

上述代码中的机器码可以使用如下工具生成,进去之后点击下载。

https://repo1.maven.org/maven2/net/roseboy/classfinal-fatjar/1.2.1/classfinal-fatjar-1.2.1.jar

然后执行,注意最后参数为大写的C。

java -jar classfinal-fatjar-1.2.1.jar -C

最后将输出的机器码放入到上方的 code 中即可。

执行 Maven 命令打包即可,生成文件如下,其中EncryptDemo-0.0.1-SNAPSHOT-encrypted.jar为生成的加密jar 包。

如需提供给客户,提供该包即可。
在这里插入图片描述

使用反编译工具,查看 jar 包中配置文件,可以看到配置文件已经为空。

反编译工具我这里用的是 luyten

https://github.com/deathmarine/Luyten/releases/tag/v0.5.4_Rebuilt_with_Latest_depenencies

在这里插入图片描述

查看代码文件,可以看到方法体被清空,只保留了方法参数、注解等信息。

原理就是启动过程中进行解密,全是内存操作,非常安全。

在这里插入图片描述

  • 无密码启动

    java -javaagent:加密jar包的名称 -jar 加密jar包的名称
    

    例如我的 jar 包名称为EncryptDemo-0.0.1-SNAPSHOT-encrypted.jar,那么执行命令如下

    java -javaagent:EncryptDemo-0.0.1-SNAPSHOT-encrypted.jar -jar EncryptDemo-0.0.1-SNAPSHOT-encrypted.jar
    
  • 有密码启动

    有密码启动与无密码启动类似,只是启动之后会提示输入密码,按照提示输入密码即可。

    在这里插入图片描述

  • 如果机器码不匹配,会提示该项目不可在此机器上运行!

    在这里插入图片描述

  • 正常启动截图如下

    在这里插入图片描述

源代码如下:https://github.com/zuiyu-main/EncryptDemo.git

分支:jar-encry

最后介绍一下 ClassFinal ,ClassFinal 能够对class文件进行加密,支持直接加密jar包或者war包,无需修改任务代码,兼容spring framework,可避免源码泄露或者字节码被反编译。

目前看官方介绍支持的功能如下:

  • 支持编译好的jar/war加密。
  • 运行加密项目,无需修改源代码。
  • 支持普通jar 包。springboot的jar包,tomcat的war包。
  • 支持 spring framework、swagger等在启动过程中扫描注解或者生成字节码的框架。
  • 支持maven 插件,添加插件即可自动加密。
  • 支持加密lib文件下的依赖。
  • 支持绑定机器运行。
  • 支持加密 springboot 配置文件。

如有需求的小伙伴可以试试,用了一下,暂时还挺好用,不知道有没有坑,有用过的小伙伴或者有更好用的工具欢迎评论区交流一下。

公众号:醉鱼Java

如果这篇文章对您有所帮助或者启发,帮忙点个关注叭,您的支持是我坚持写作的最大动力。

求一键三连:点赞、收藏、关注。

谢谢支持哟 ( __ )。

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

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

相关文章

RuoYi 开源框架,集成了后端管理,后端java版 App 移动解决方案

文章目录 前言一、后端&#xff1a;二、后台管理三、App 移动总结 前言 后端&#xff1a; 后台管理&#xff1a; 使用的前端技术Vue、Element后端SpringBoot & Security完全分离的权限管理系统。 App 移动解决方案&#xff1a;采用uniapp框架 提示&#xff1a;以下是本篇文…

Java后端编程语言进阶篇

第一章 函数式接口 函数式接口是Java 8中引入的一个新特性&#xff0c;只包含一个抽象方法的接口。 函数式接口可以使用Lambda表达式来实现&#xff0c;从而实现函数式编程的特性。 使用 FunctionalInterface标识接口是函数式接口&#xff0c;编译器才会检查接口是否符合函数…

Qt 实现自定义截图工具

目录 Qt 实现自定义截图工具实现效果图PrintScreen 类介绍PrintScreen 类的主要特性 逐步实现第一步&#xff1a;类定义第二步&#xff1a;初始化截图窗口第三步&#xff1a;处理鼠标事件第四步&#xff1a;计算截图区域第五步&#xff1a;捕获和保存图像 完整代码PrintScreen.…

《程序猿之设计模式实战 · 池化思想》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

“xi” 和 “dbscan” 在OPTICS聚类中是什么意思

在 OPTICS&#xff08;Ordering Points To Identify the Clustering Structure&#xff09; 聚类算法中&#xff0c;xi 和 dbscan 是两种不同的聚类提取方法&#xff0c;它们用于从OPTICS算法生成的排序数据中提取最终的聚类结构。具体解释如下&#xff1a; dbscan 方法: 该方法…

LSS如何做深度和语义预测

get_cam_feats() 先来看看代码: def get_cam_feats(self, x):"""Return B x N x D x H/downsample x W/downsample x C"""B, N

PHP函数如何传递数组参数

php 函数可以使用数组参数传递大量数据。语法&#xff1a;参数类型前加上方括号 ([])。例如&#xff1a;myfunction(array $arr)。实战案例&#xff1a;计算数组元素平均值。注意&#xff1a;数组参数默认为引用传递&#xff0c;类型提示可提高代码可读性&#xff0c;数组解构可…

解锁编程潜力,从掌握GitHub开始

目录&#xff1a; 一、搜索开源项目 1、什么是Git 2、Github常用词含义 3、一个完整的项目界面 4、使用Github搜索项目 1&#xff09;in关键词 2&#xff09;star或fork数量去查找 3&#xff09;awesome加强搜索 二、访问速度慢的解决 1、使用网易UU加速器 2、使用…

OpenSSL工具验证RSA证书

openssl x509 是一个用于处理 X.509 证书的命令行工具。常用的 openssl x509 命令&#xff1a; -in <file>&#xff1a;指定输入文件。-out <file>&#xff1a;指定输出文件。-noout&#xff1a;不输出证书信息。-text&#xff1a;以文本格式输出证书信息。-pubke…

基于SSM的大学新生报到系统+LW参考示例

系列文章目录 1.基于SSM的洗衣房管理系统原生微信小程序LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统LW参考示例 3.基于SpringBootVue的企业人事管理系统LW参考示例 4.基于SSM的高校实验室管理系统LW参考示例 5.基于SpringBoot的二手数码回收系统原生微信小程序LW参考示…

关于RabbitMQ消息丢失的解决方案

RabbitMQ如何保证消息的可靠性传输 一、消息丢失的原因 1. 生产者端 网络问题&#xff1a; 原因&#xff1a;生产者与RabbitMQ服务器之间的网络连接不稳定或中断&#xff0c;导致消息在传输过程中丢失。解决方案&#xff1a;确保网络连接稳定&#xff0c;监控网络状态&#x…

springboot后端开发-常见注解及其用途

文章目录 1. 组件注解2. 依赖注入注解3. 配置类注解4. 测试注解5. 控制器注解6. 安全和认证注解7. 切面相关注解8. API文档相关注解(需引入swagger)9. 其他注解 在Spring Boot框架中&#xff0c;有许多常用的注解用来简化开发过程中的依赖注入、组件扫描、配置、安全控制等方面…

VSCode创建C++项目和编译多文件

前言 在刚安装好VSCode后&#xff0c;我简单尝试了仅main.cpp单文件编译代码&#xff0c;没有问题&#xff0c;但是当我尝试多文件编译时&#xff0c;就出现了无法识别cpp文件。 内容 创建项目 首先点击左上角“文件”&#xff1b;在菜单中选择“打开文件夹”&#xff1b;在…

软件测试工程师面试整理-数据库与SQL

在软件测试过程中,数据库和SQL的知识是非常重要的,尤其是在涉及数据密集型应用或需要验证数据准确性的场景中。测试人员需要掌握SQL语句,以便查询、插入、更新和删除数据,并验证数据库操作的正确性。 1. 数据库基础知识 ● 关系型数据库:大多数应用使用关系型数据库(如My…

Qt什么时候触发paintEvent事件

‌paintEvent事件可以在以下几种情况下被触发‌&#xff1a; ‌窗口初始化和显示‌&#xff1a;当窗口首次被创建、显示&#xff0c;或者窗口被覆盖、最小化后再恢复时&#xff0c;paintEvent会被触发以绘制窗口的内容。‌部件大小或位置变化‌&#xff1a;如果窗口或部件的大…

【Elasticsearch系列二】安装 Kibana

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

ClickHouse 24.8 LTS 版本发布说明

本文字数&#xff1a;13885&#xff1b;估计阅读时间&#xff1a;35 分钟 作者&#xff1a;ClickHouse Team 本文在公众号【ClickHouseInc】首发 时间飞逝&#xff0c;又到了新版本发布的时刻&#xff01; 发布概要 本次ClickHouse 24.8 版本包含了19个新功能&#x1f381;、18…

基于51单片机的16X16点阵显示屏proteus仿真

地址&#xff1a; https://pan.baidu.com/s/1JQ225NSKweqf1Zlad_f1Mw 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectro…

管家婆云辉煌手机端怎么连接蓝牙打印机?

管家婆云辉煌手机端可以连接蓝牙打印机&#xff0c;这样手机可以发送打印任务到蓝牙打印机&#xff0c;完成打印任务。具体的设置步骤如下&#xff1a; 一、首先完成手机和蓝牙打印机配对&#xff0c;打开蓝牙打印机后。手机开启蓝牙和定位服务 点击手机设置&#xff0c;进入手…

分类预测|基于差分优化DE-支持向量机数据分类预测完整Matlab程序 DE-SVM

分类预测|基于差分优化DE-支持向量机数据分类预测完整Matlab程序 DE-SVM 文章目录 一、基本原理DE-SVM 分类预测原理和流程总结 二、实验结果三、核心代码四、代码获取五、总结 一、基本原理 DE-SVM 分类预测原理和流程 1. 差分进化优化算法&#xff08;DE&#xff09; 原理…