Java 程序通常以 Jar、War 或 Class 文件交付。编译后的 Class 文件仍保留类、方法、成员和字节码等结构信息。使用 jadx、JD-GUI 等工具,逆向分析人员可以对未保护的 Java 文件进行反编译,进一步分析业务逻辑、算法实现和授权校验。
对于需要以 Jar 或 War 形式交付的 Java 项目,仅依靠编译难以控制代码暴露风险,还需结合待保护的方法、运行性能和部署环境选择适合的 Java 保护方式。
Java 程序的代码暴露风险
Java 程序主要面临以下风险:
- Class 中的方法逻辑被反编译工具分析;
- 代码中的敏感字符串被直接搜索;
- Jar 或 War 文件被复制和盗用;
- Jar 包中的文件被修改,影响文件完整性。
选择保护方式前,需要确认待保护的 Java 文件和方法,并评估目标 JDK、操作系统、CPU 架构、运行性能和部署方式。
Virbox Protector 的两种 Java 保护方式
Virbox Protector(VBP)面向 Java 程序提供 BCE 和 VME 两种保护方式。BCE 对选定 Java 文件中 Class 的方法字节码进行加密;VME 将选定方法转换为自定义虚拟机指令,适合保护安全要求较高的关键方法。
BCE:Java 方法字节码加密
Java BCE 会对 Class 中的方法字节码进行加密。程序运行时,Java Agent 在 Native 层按需解密方法字节码,再交给 JVM 编译和执行。每次仅在内存中解密一个方法,方法使用完成后,解密内容会在内存中清理。
BCE 可用于 Jar、War 或包含多个 Jar 的 Java 项目。它的性能影响较小,支持 JDK 1.6 及以上环境,并可根据运行平台选择 Windows、Linux、Arm Linux 和 macOS 等平台。
BCE 有明确的使用边界:保护后的 Jar 用于直接运行,不能像普通 Jar 一样被其他项目调用;运行环境需要配置 sjt_agent.jar;BCE 只保护代码逻辑,不保护类名、方法名、注解、接口和静态属性等信息。
VME:选定方法的代码虚拟化
Java VME 会将选定方法的 JVM 字节码转换为自定义虚拟机指令,运行时交由 Native 虚拟机执行。自定义虚拟机代码在保护时可以随机化。若要理解被保护的方法,需要分析 Native 解释器逻辑,并还原自定义指令与 JVM 字节码之间的对应关系。常规 Java 反编译工具无法直接按原有方式还原被虚拟化的方法。
VME 适合保护授权校验、核心算法、加密处理和通信认证等关键方法。除代码虚拟化外,VME 还支持字符串加密、调试器检测、文件校验、SDK 标签和性能报告。
BCE 与 VME 对比:保护对象、机制与适用范围
两种方式在保护对象、执行机制、性能影响和部署要求方面存在差异。根据这些差异,可以确定各自适合解决的问题:
| 对比项 | BCE | VME |
|---|---|---|
| 保护对象 | 选定 Java 文件中 Class 的方法字节码 | 选定的关键方法 |
| 核心机制 | 运行时按方法解密字节码 | 将字节码转换为自定义虚拟机指令执行 |
| 主要作用 | 降低 Jar、War 中方法逻辑被直接反编译的风险 | 增加关键方法的逆向分析难度 |
| 性能影响 | 较小 | 有一定影响,需要筛选方法并测试 |
| 适用对象 | 需要保护方法字节码的 Jar、War 或 Class 文件 | 安全要求较高的关键方法 |
| 项目调用 | 保护后的 Jar 无法被其他项目调用,只能运行 | 保护后的 Jar 可作为依赖被其他 Java 项目调用 |
| 部署关注点 | Java Agent、Jar/War 启动配置 | 方法选择、兼容性和性能测试 |
| 内嵌 Jar | 支持选择内嵌 Jar 保护 | 需要取出后单独保护,再放回原 Jar 处理 |
BCE 与 VME 选型建议
Jar、War 方法字节码保护:BCE
需要保护 Jar 或 War 中的方法字节码,并希望控制运行性能影响时,可以选择 BCE。运行前需要配置 Java Agent。
关键方法代码虚拟化:VME
需要重点保护授权判断、核心算法、密钥处理或通信认证方法时,可以对这些方法启用 VME。保护前应确认方法是否受支持,保护后测试运行性能。
组合使用:先 VME,后 BCE
项目同时包含需要重点保护的关键方法和需要字节码加密的普通方法时,可以组合使用 VME 与 BCE。组合使用时,应先进行 VME 保护,再使用 BCE 保护。完成保护后,应在实际运行环境中验证启动、业务功能和性能。
Java 程序保护的实施流程
保护配置前,应先梳理待保护文件和方法,再选择对应方案:
- 确认需要保护的 Jar、War 或 Class 文件;
- 确认授权校验、核心算法、加密处理和敏感数据所在的方法;
- 根据保护需求选择 BCE 或 VME:方法字节码加密采用 BCE,关键方法代码虚拟化采用 VME;
- 根据运行环境选择操作系统和 CPU 架构;
- 在图形界面或命令行中完成保护;
- 按实际启动方式配置 Java Agent、容器参数或其他运行时组件;
- 在目标环境验证启动、业务功能、兼容性和性能。
部署与兼容性注意事项
- BCE 保护后的 Jar 需要配置 Java Agent,直接使用普通
java -jar命令可能无法启动; - War 包部署到 Tomcat 等容器时,需要根据 Windows、Linux 或 macOS 的启动方式配置
sjt_agent.jar; - macOS ARM64 环境可能需要对 Agent 或保护后 Jar 中的动态库进行签名;
- VME 不宜无差别虚拟化所有方法,需要根据性能报告和运行测试筛选方法;
- 使用 VME 保护内嵌 Jar 时,需要先取出内嵌 Jar 进行保护,再放回原 Jar 并处理外层 Jar;
- 交付前应在实际 JDK、操作系统和中间件环境中验证功能、性能和兼容性。
具体配置、命令行参数和部署方式可查阅 VBP 官方《Java BCE 方式保护最佳实践》 与 《Java VME 方式保护最佳实践》,也可通过 官方试用入口 进行评估。
深盾科技 · Virbox | 让数字世界充满信任
Virbox Protector(VBP)是一套面向软件交付安全的全栈软件加密与应用加固解决方案,广泛覆盖本地程序、移动应用、Java/.NET/Python、Unity、SDK、静态库、目标文件与 AI 模型等软件资产,帮助企业在交付之后依然保持代码、算法、资源和业务价值可控。
