Springboot 程序实现加密,禁止 jadx 反编译

在Spring Boot中实现程序加密和禁止jadx反编译是一个复杂的问题。虽然无法完全禁止反编译,但可以通过一些技术手段来提高代码的安全性。

以下是一些可能的措施:

  1. 使用混淆工具:使用Java代码混淆工具(如ProGuard或YGuard)可以对代码进行混淆,使其难以被理解和反编译。

  2. 加密敏感信息:对于一些敏感信息(如数据库密码、API密钥等),可以将其加密或存储在安全的地方,避免明文存储在代码中。

  3. 使用加密算法:对于一些关键代码或配置文件,可以使用加密算法进行加密,只有在程序运行时才进行解密。

  4. 使用类加载器加密:可以自定义类加载器,在类加载时对字节码进行加密,然后在内存中解密并加载该类。

  5. 使用防护工具:可以使用一些第三方的防护工具,如JShielder、DashO等,它们提供了一些额外的保护措施,如字符串加密、代码隐藏等。

需要注意的是,这些措施只能提高代码的安全性,并不能完全阻止反编译。攻击者仍然可能使用其他方法来尝试反编译你的代码。因此,除了加强代码的安全性外,还应该注意其他层面的安全措施,如网络传输加密、权限控制等。

最重要的是,保持代码的可读性和可维护性,遵循良好的编程实践,编写清晰、模块化的代码,以便于团队合作和后续维护。

背景

toB 的本地化 java 应用程序,通常是部署在客户机器上,为了保护知识产权,我们需要将核心代码(例如 Lience,Billing,Pay 等)进行加密或混淆,防止使用 jadx 等工具轻易反编译。同时,为了更深层的保护程序,也要防止三方依赖细节被窥探;

业界方案

  1. ProGuardhttps://github.com/Guardsquare/proguard

    • 简介:开源社区有名的免费混淆工具,相较于字节码加密,对性能基本无影响;

    • 优势:打包阶段混淆字节码,各种变量方法名都变成了abcdefg 等等无意义的符号,字节码可被反编译,但几乎无法阅读,通常被 Android App 用来防止逆向;

    • 不足1:只能混淆部分代码,打包阶段较为耗时,对于三方包混淆,并没有什么好办法。

    • 不足2:混淆后的代码,会影响 arthas 工具的使用,导致排查问题变慢。

    • 不足3:配置比较复杂,曾经在我司 T 项目上用过,令人眼花缭乱。

    • 不足4:无法加密三方依赖所有信息;

  2. jar-protecthttps://gitee.com/chejiangyi/jar-protect

    • 简介:一款国人开发的 springboot jar 加密工具;需要配合 javaagent 解密;

    • 优势:打包阶段使用 javassist 重写 class 文件;jadx 反编译后看到的都是空方法。反编译后只能看到类信息和方法签名,无法看到具体内容。

    • 不足1:使用 DES 方案,对于几百个三方 jar 的场景,加密手段过重,且加密后的不够完整;

    • 不足2:类文件放在一个目录(META-INF/.encode/),非常容易类冲突;

    • 不足3:无法加密三方依赖所有信息;

  3. GraalVMhttps://javakk.com/tag/graalvm

    • 简介:Oracle GraalVM 提前将 Java 应用程序编译为独立的二进制文件。与在 Java 虚拟机 (JVM) 上运行的应用程序相比,这些二进制文件更小,启动速度提高了 100 倍,无需预热即可提供峰值性能,并且使用的内存和 CPU 更少, 并且无法反编译。

    • 不足:无法支持我司业务程序框架。

  4. core-lib/xjarhttps://github.com/core-lib/xjar

    • 简介:国人开源的,基于 golang 的加密工具。使用 maven 插件加密,启动时 golang 解密;性能影响未知。

    • 优势:可对所有 class 文件加密。

    • 不足1:加密后 jar 文件体积翻倍;

    • 不足2:依赖 golang 编译,依赖 golang 启动;

    • 不足3:无法加密三方依赖所有信息;

    • 不足4:开源项目,3年未有新提交。

思考:

我们的需求到底是什么?a:保护知识产权。具体手段为:

  1. 对本司项目代码进行加密,使其无法被 jadx 工具轻易反编译,

  2. 对本司三方依赖进行加密,使其无法窥探我司三方依赖细节;

但上面的几个项目,基本都是围绕着 class 加密(除了GraalVM),这无法实现我们的第二个需求。

方案

设计目标:

  1. 将项目三方依赖 jar 进行加密,使其无法使用 jadx 反编译,但运行时会生成解密后的临时文件。

  2. 将项目本身的 class 进行加密,使其无法使用 jadx 反编译运行时解密后的文件。

  3. 加密策略要灵活,轻量,对启动速度,包体积,内存消耗,接口性能的影响要控制在 5% 以内;

设计方案:

  1. 加密jar时,使用 maven 打包工具,repackage fat jar;将其内部 lib 目录的依赖进行加密;使 jadx 无法反编译;

  2. 加密class时,对于核心业务代码,使用 javassist 工具将其重写,清空方法体,重置属性值;

  3. 解密jar时,将指定目录的 加密包 解密 到指定目录,并将其放入 springboot classloader classpath 里。

  4. 解密class时,agent 配合判断是否是加密 class,如果是,则寻找加密 class 文件,找到后解密,返回解密后的 classBytes。

逻辑如下:

注意点:

  1. javassist 重写方法体时,需要将 lib 里的所有代码都加入 classpool 的 classpath 里。

  2. javassist 加密后的类,需将其放入到当前 lib 的单独目录进行个例,防止类冲突。

  3. agent 解密要轻量,不能影响程序性能;

  4. 三方包的加解密重新打包后,jar 顺序发生变化,较小可能会导致类冲突(比如 log4j)。需要在测试环境验证,如果存在冲突,则需要排包。

总结

通过以上方案,我们实现了一个极其轻量的 maven 加密,agent 解密插件。他能够将三方包彻底加密,使 jadx 等工具无法反编译 ,屏蔽我们的三方依赖细节,同时,该插件也可以加密我们的业务 class 代码,使 jadx 无法反编译运行时生成的代码,从而一定程度的保护我们的知识产权;

另外,私有的加密算法,在性能,体积,内存等方便的影响都控制在 5% 以内。

为了防止混淆后的代码影响 arthas 的使用和 bug patch 的应用,我们放弃了混淆方案,只能说是一种权衡与取舍吧。

从软件防破解的角度来理解,通常只能是加大破解的难度,铁了心想要破解的话,就算是 ProGuard 混淆,也无法解决。也许只能用 GraalVM,但不是每一个客户都会用这个。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL MVCC机制详解

MySQL MVCC机制详解 MVCC, 是Multi Version Concurrency Control的缩写,其含义是多版本并发控制。这一概念的提出是为了使得MySQL可以实现RC隔离级别和RR隔离级别。 这里回顾一下MySQL的事务, MySQL的隔离级别和各种隔离级别所存在的问题。 事务是由 …

Sandbox: bash(5613) deny(1) file-write-create 错误解决

Showing Recent Errors Only Sandbox: bash(5613) deny(1) file-write-create /Users/xx/Dev/UniappLearn/MSLUniappDemo/Pods/resources-to-copy-MSLUniappDemo.txt image.png 解决方法 build setting搜索ENABLE_USER_SCRIPT_SANDBOXING,YES(默认&…

揭秘软件测试培训骗局:如何从贩卖焦虑到高薪包就业

你可能并不是一个IT行业的从业者,也可能是第一次听说软件测试工程师这个岗位。但由于看了某个网站的广告,或者听某个人说可以花钱培训软件测试技术,入职软件测试工程师岗位,于是动了这方面的心思。 但是互联网上有很多地方说&…

JavaScript中的原型和原型链

给大家推荐一个实用面试题库 1、前端面试题库 (面试必备) 推荐:★★★★★ 地址:web前端面试题库 原型和原型链是JavaScript中一个重要且常常被误解的概念。它们在理解对象、继承和属性查找时扮演着关键的角色。 1…

clickhouse的安装和配置

使用虚拟机测试, 系统为ubuntu 22.04 一 安装 sudo apt-get install -y apt-transport-https ca-certificates dirmngr sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 8919F6BD2B48D754echo "deb https://packages.clickhouse.com/deb stable ma…

μC/OS-II---内存管理2(os_core.c)

流程---内存管理扩展 初始化μC/OS-II创建用户起始任务开始多任务调度统计Task创建用户应用程序任务 初始化μC/OS-II void OSInit (void) {OSInitHookBegin(); /* Call port specific initialization code */OS_InitMisc(); …

μC/OS-II---Task管理2(os_task.c)

目录 改变Task优先级Task挂起Task恢复Task信息获取Task调度器上锁(os_core.c)Task调度器开锁(os_core.c) 改变Task优先级 #if OS_TASK_CHANGE_PRIO_EN > 0u INT8U OSTaskChangePrio (INT8U oldprio,INT8U newprio) { #if (…

2023/11/14JAVA学习

主子线程每次执行顺序可能都不一样

什么猫罐头好吃?猫咪嘎嘎炫的5款猫主食罐头推荐!

想必铲屎官都知道给猫咪长期吃主食罐头的好处了吧!主食罐头不仅营养丰富,还能让猫咪顺便补充水分。有时候猫咪食欲不佳,一罐猫主食罐头就能让它们胃口大开呢~ 作为家里有3只猫的铲屎官来说,养猫的这几年可以说血泪史了&#xff0…

Java版企业电子招标采购系统源码—企业战略布局下的采购寻源

项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及审…

HTML5响应式网页设计(考试题:旅游项目)

效果图 .html代码 <!DOCTYPE html> <html><head><meta name"viewport"content"widthdevice-width,initial-scale1,minimum-scale1,maximum-scale1,user-scalableno" /><meta charset"utf-8" /><title></…

keil5暗色主题配置

在keil文件目录下找到global.prop 将以下内容替换至该文件即可 # properties for all file types indent.automatic1 virtual.space0 view.whitespace0 view.endofline0 code.page0 caretline.visible0 highlight.matchingbraces1 print.syntax.coloring1 use.tab.color1 crea…

leetcode刷题日记:121. Best Time to Buy and Sell Stock( 买卖股票的最佳时机)

题目给了我们一组数prices&#xff0c;其中prices[i]表示第i天的股票价格&#xff0c;需要我们求出买卖股票所能获得的最大收益。 我们的第一想法就是从算出每一种买卖股票的情况然后求出里面的最大值&#xff0c;这样我们就能得到最大收益是多少&#xff0c;但是这种情况过于复…

LLM(四)| Chinese-LLaMA-Alpaca:包含中文 LLaMA 模型和经过指令微调的 Alpaca 大型模型

论文题目&#xff1a;《EFFICIENT AND EFFECTIVE TEXT ENCODING FOR CHINESE LL AMA AND ALPACA》 ​论文地址&#xff1a;https://arxiv.org/pdf/2304.08177v1.pdf Github地址&#xff1a;https://github.com/ymcui/Chinese-LLaMA-Alpaca 一、项目介绍 通过在原有的LLaMA词…

Lua的Resty-Request库写的一个简单爬虫

文章目录 准备工作编写爬虫运行爬虫代码分析拓展功能总结 &#x1f389;欢迎来到AIGC人工智能专栏~Lua的Resty-Request库写的一个简单爬虫 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏&#xff1a;AIGC人工智…

Databend 与海外某电信签约:共创海外电信数据仓库新纪元

为什么选择 Databend 海外某电信面临的主要挑战是随着业务量的增加&#xff0c;传统的 Clickhouse Hive 方案在数据存储和处理上开始显露不足。 原来的大数据分析采用的 Clickhouse Hive 方案进行离线的实时报表。但随着业务量的上升后&#xff0c;Hive的数据存储压力变大&…

HTTP代理与SOCKS5代理,有什么区别?

在数字通信领域&#xff0c;数据安全和匿名性都是非常重要的指标。互联网的不断发展催生了几种协议&#xff0c;每种协议都有独特的优势和挑战。其中&#xff0c;SOCKS5 代理、HTTP代理最为广泛使用&#xff0c;下面给大家一起讨论&#xff0c;HTTP代理与SOCKS5代理&#xff0c…

[文件读取]coldfusion 文件读取 (CVE-2010-2861)

1.1漏洞描述 漏洞编号CVE-2010-2861漏洞类型文件读取漏洞等级⭐⭐漏洞环境VULFOCUS攻击方式 描述: Adobe ColdFusion是美国Adobe公司的一款动态Web服务器产品&#xff0c;其运行的CFML&#xff08;ColdFusion Markup Language&#xff09;是针对Web应用的一种程序设计语言。 A…

市场行情回暖、利好月来袭,Web3 广告业领头羊 Verasity 或迎爆发

随着区块链技术的普及和发展&#xff0c;越来越多的行业正在被区块链技术所重塑&#xff0c;例如金融、游戏行业等&#xff0c;而数字广告行业的结构和运作方式也正在被区块链技术所重塑。 众所周知&#xff0c;传统数字广告行业往往存在着信息不对称、广告欺诈、数字隐私等问题…

《008.SpringBoot之教务系统》【界面简洁功能简单】

《008.SpringBoot之教务系统》【界面简洁功能简单】 项目简介 [1]本系统涉及到的技术主要如下&#xff1a; 推荐环境配置&#xff1a;DEA jdk1.8 Maven MySQL 前后端分离; 后台&#xff1a;SpringBootMybatis; 前台&#xff1a;JSPBootStrap; [2]功能模块展示&#xff1a; 管…