Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >实现 Springboot 程序加密,禁止 jadx 反编译

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

作者头像
良月柒
发布于 2023-12-15 05:24:12
发布于 2023-12-15 05:24:12
40700
代码可运行
举报
运行总次数:0
代码可运行

阅读本文大概需要 3.5 分钟。

来自:网络,侵删

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)。需要在测试环境验证,如果存在冲突,则需要排包。

End

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

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

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

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

<END>

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
内容包含Java基础、JavaWeb、MySQL性能优化、JVM、锁、百万并发、消息队列、高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper......等技术栈!
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-12-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员的成长之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring Boot项目Jar包加密:防止反编译的安全实践
在当今互联网高速发展的时代,软件安全问题变得尤为突出。随着开源技术的普及,Spring Boot等框架的应用越来越广泛,但也伴随着代码被反编译的风险。为了保护知识产权和应用程序的安全性,开发者们需要采取一些措施来防止恶意分析和滥用。本文将探讨在Spring Boot项目中对Jar包进行加密,以防止反编译的安全实践。
IT_陈寒
2023/12/29
1.6K0
Spring Boot项目Jar包加密:防止反编译的安全实践
Maven - 代码混淆proguard-maven-plugin vs 代码加密classfinal
https://github.com/wvengen/proguard-maven-plugin
小小工匠
2024/05/26
1.5K0
Maven - 代码混淆proguard-maven-plugin vs 代码加密classfinal
Java源码混淆,jar包加密,禁止反编译jar包
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第32天,点击查看活动详情
鳄鱼儿
2024/05/22
5740
Java源码混淆,jar包加密,禁止反编译jar包
Java 代码混淆快速上手
如果用 zip 方式打开一个 Jar 包,将会看到一堆配置文件以及class文件。使用一些解码软件可以粗略的逆向出原代码。如果这个jar包的作者再里面加入了一些无用、冗余的指令等代码,逆向出来也完全看不懂。这种方式就是本篇的主题,代码混淆(Obfuscation)
花花Binki
2024/11/15
2060
SpringBoot 玩一玩代码混淆,防止反编译代码泄露
比较常用的反编译工具 JD-GUI ,直接把编译好的jar丢进去,大部分都能反编译看到源码:
搜云库技术团队
2023/03/15
9210
SpringBoot 玩一玩代码混淆,防止反编译代码泄露
防止反编译,保护你的SpringBoot项目
ClassFinal-maven-plugin插件是一个用于加密Java字节码的工具,它能够保护你的Spring Boot项目中的源代码和配置文件不被非法获取或篡改。下面是如何使用这个插件来加密test.jar包的详细步骤:
科技新语
2025/02/11
1690
防止反编译,保护你的SpringBoot项目
Java 应用安全之 JEB Floating License 绕过
最近一朋友单位采购了 JEB Pro 用于 Android 逆向,但使用的是 Floating License,因此只能在公司内网中使用。这样一来朋友在节假日就没法卷了,于是找到了我看有没有兴趣研究一下。虽然笔者之前搞过一段时间 Java 逆向,但那主要针对 Android 应用,对于 PC 应用那是大姑娘坐花轿 —— 头一回。本着学习新知识的心态,就接下了这个任务。
evilpan
2024/05/04
1890
Java 应用安全之 JEB Floating License 绕过
这个反编译工具真心强大!Java 开发神器!!!
大家好,我是 Guide。在上一期的开源项目推荐中,我推荐了一款强大的反编译工具,我在文中提到说要写一篇专门来介绍这个神器,今天这篇文章就来了。稍有迟到,抱歉(。・_・。)ノ
Guide哥
2022/02/18
2.6K0
这个反编译工具真心强大!Java 开发神器!!!
“码码”再也不用担心我的代码被反编译了!
自己辛辛苦苦写出来的代码,被别人无情的反编译了怎么办? 一、背景 Java是一种跨平台的、解释型语言,Java源代码编译成中间“字节码”存储于class文件中。由于跨平台的需要,Jav
程序源代码
2018/03/30
3K0
“码码”再也不用担心我的代码被反编译了!
31.3k stars的反编译高效工具JADX
![](/Users/mac/Library/Application Support/typora-user-images/image-20220818113017422.png)
开源日记
2023/03/10
1.1K0
31.3k stars的反编译高效工具JADX
Maven - 代码混淆Proguard踩坑记
Maven - 代码混淆proguard-maven-plugin vs 代码加密classfinal
小小工匠
2024/05/26
9570
Maven - 代码混淆Proguard踩坑记
Android反编译与加密(代码混淆)
#反编译 win系统好久不用了而且win系统下的反编译工具和教程一大堆,这里讲讲Mac下反编译工具。 目前,mac下有两款工具不错,分别是Jadx和AndroidDecompiler
先知先觉
2019/01/21
1.6K0
Java 反编译工具的使用与对比分析
Java 反编译,一听可能觉得高深莫测,其实反编译并不是什么特别高级的操作,Java 对于 Class 字节码文件的生成有着严格的要求,如果你非常熟悉 Java 虚拟机规范,了解 Class 字节码文件中一些字节的作用,那么理解反编译的原理并不是什么问题。甚至像下面这样的 Class 文件你都能看懂一二。
未读代码
2021/06/21
2.1K0
Java 反编译工具的使用与对比分析
有了这个工具,再也不担心代码被抄袭 !
在开发项目时,我们不希望自己的代码被别人抄袭,但是 Java 开发的项目可以被反编译,我们可以用代码混淆的方式来解决。Java 代码混淆就是为了保护 Java 源代码,对编译好的 class 文件进行混淆处理。
永恒君
2022/12/07
2.1K0
有了这个工具,再也不担心代码被抄袭 !
Android安全攻防战,反编译与混淆技术完全解析(下)
在上一篇文章当中,我们学习了Android程序反编译方面的知识,包括反编译代码、反编译资源、以及重新打包等内容。通过这些内容我们也能看出来,其实我们的程序并没有那么的安全。可能资源被反编译影响还不是很
用户1158055
2018/01/08
1.8K0
Android安全攻防战,反编译与混淆技术完全解析(下)
Jar 包加密
字节码混淆就是对类名、字段名、方法名进行替换,让其变得无意义,使其他人反编译后很难读懂,但并不影响逻辑。
wsuo
2023/04/16
4.1K0
每日开源 | 推荐一款java class文件安全加密工具,你也许用得到
ClassFinal是一款java class文件安全加密工具,支持直接加密jar包或war包,无需修改任何项目代码,兼容spring-framework;可避免源码泄漏或字节码被反编译。
终码一生
2022/04/15
1.7K0
Java jar 如何防止被反编译
java作为解释型的语言,其高度抽象的特性意味其很容易被反编译,容易被反编译,自然有防止反编译措施存在。今天就拜读了一篇相关的文章,受益匪浅,知彼知己嘛!!之所以会对java的反编译感兴趣,那是因为自己在学习的过程中,常常需要借鉴一下别人的成果(你懂的...)。或许反编译别人的代码不怎么道德,这个嘛......
用户2781897
2021/11/10
3.5K0
[1036]Jadx gui(JAVA反编译工具)
Jadx gui是一款JAVA反编译工具。一个简单轻巧的 DEX 到 Java 反编译器,可让您导入 DEX,APK,JAR 或 CLASS 文件并将其快速导出为 DEX 格式。如果您是 Android 开发人员,您可能会理解,没有适当的软件帮助,就无法构建,测试或调试应用程序。幸运的是,如今有大量的产品可以帮助您实现快速,便捷的结果。
周小董
2021/08/05
2.6K0
Spring6 AOT 提前编译
JIT和AOT 这个名词是指两种不同的编译方式,这两种编译方式的主要区别在于是否在“运行时”进行编译
鱼找水需要时间
2023/06/24
3460
Spring6 AOT 提前编译
推荐阅读
相关推荐
Spring Boot项目Jar包加密:防止反编译的安全实践
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验