专栏名称: Java基基
一个苦练基本功的 Java 公众号,所以取名 Java 基基
目录
相关文章推荐
四川商务  ·  加大“金融+政策”等支持力度 ... ·  昨天  
四川商务  ·  加大“金融+政策”等支持力度 ... ·  昨天  
云南省商务厅  ·  外贸促进信息 | 第二十一期《市场供需信息》 ·  昨天  
洪观新闻  ·  支付宝紧急回应! ·  3 天前  
洪观新闻  ·  支付宝紧急回应! ·  3 天前  
51好读  ›  专栏  ›  Java基基

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

Java基基  · 公众号  ·  · 2024-11-23 11:55

主要观点总结

该文章主要介绍了在保护知识产权方面,如何对Java应用程序进行加密,以防止代码被反编译。文章列举了几种常见的混淆工具,并提出了自己的需求目标和设计方案。此外,文章还介绍了一个知识星球,提供项目实战、面试招聘、源码解析和学习路线等内容。

关键观点总结

关键观点1: 文章主题

介绍Java应用程序的加密方法和保护知识产权的方案。

关键观点2: 常见的混淆工具介绍

包括ProGuard、jar-protect、GraalVM等,及其优势和不足。

关键观点3: 需求目标

保护知识产权,对项目和三方依赖进行加密,防止使用jadx等工具反编译。

关键观点4: 设计方案

使用maven打包工具对三方依赖进行加密,使用javassist工具对核心业务代码进行重写和加密。

关键观点5: 知识星球的介绍

介绍知识星球的内容,包括项目实战、面试招聘、源码解析和学习路线等。


正文

👉 这是一个或许对你有用 的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入 芋道快速开发平台 知识星球。 下面是星球提供的部分资料:

👉 这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号等等功能:

  • Boot 仓库:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud
  • 视频教程:https://doc.iocoder.cn
【国内首批】支持 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 双版本

来源:网络


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

业界方案

  1. ProGuard https://github.com/Guardsquare/proguard
  • 简介:开源社区有名的免费混淆工具,相较于字节码加密,对性能基本无影响;
  • 优势:打包阶段混淆字节码,各种变量方法名都变成了abcdefg 等等无意义的符号,字节码可被反编译,但几乎无法阅读,通常被 Android App 用来防止逆向;
  • 不足1:只能混淆部分代码,打包阶段较为耗时,对于三方包混淆,并没有什么好办法。
  • 不足2:混淆后的代码,会影响 arthas 工具的使用,导致排查问题变慢。
  • 不足3:配置比较复杂,曾经在我司 T 项目上用过,令人眼花缭乱。
  • 不足4:无法加密三方依赖所有信息;
  1. jar-protect https://gitee.com/chejiangyi/jar-protect
  • 简介:一款国人开发的 springboot jar 加密工具;需要配合 javaagent 解密;
  • 优势:打包阶段使用 javassist 重写 class 文件;jadx 反编译后看到的都是空方法。反编译后只能看到类信息和方法签名,无法看到具体内容。
  • 不足1:使用 DES 方案,对于几百个三方 jar 的场景,加密手段过重,且加密后的不够完整;
  • 不足2:类文件放在一个目录(META-INF/.encode/),非常容易类冲突;
  • 不足3:无法加密三方依赖所有信息;
  1. GraalVM https://javakk.com/tag/graalvm
  • 简介:Oracle GraalVM 提前将 Java 应用程序编译为独立的二进制文件。与在 Java 虚拟机 (JVM) 上运行的应用程序相比,这些二进制文件更小,启动速度提高了 100 倍,无需预热即可提供峰值性能,并且使用的内存和 CPU 更少, 并且无法反编译。
  • 不足:无法支持我司业务程序框架。
  1. core-lib/xjar https://github.com/core-lib/xjar
  • 简介:国人开源的,基于 golang 的加密工具。使用 maven 插件加密,启动时 golang 解密;性能影响未知。
  • 优势:可对所有 class 文件加密。
  • 不足1:加密后 jar 文件体积翻倍;
  • 不足2:依赖 golang 编译,依赖 golang 启动;
  • 不足3:无法加密三方依赖所有信息;
  • 不足4:开源项目,3年未有新提交。

思考:

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

  1. 对本司项目代码进行加密,使其无法被 jadx 工具轻易反编译,
  2. 对本司三方依赖进行加密,使其无法窥探我司三方依赖细节;

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

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

我们的方案

设计目标:

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






请到「今天看啥」查看全文