Skip to main content

Java不同保护方案的区别

背景#

由于不同的用户对Java程序保护的侧重点不同,在性能损耗、安全性及价格方面等考量上,我们针对Java程序提供了三种保护方案,分别是Java bcejava vme和DS保护方式。

区别#

这三种保护方式可以从保护原理、保护流程、安全程度和运行等几个层面上进行区分。

保护原理不同#

Java vme保护方式

将Java字节码从Java方法中抽离,替换为一个对Native代码的调用,抽离的Java字节码被转换成自定义的虚拟机代码,调用本地代码就是调用自定义的虚拟机执行这些字节码,安全性极高。

Java bce保护方式

Java bce方式是对class中的所有⽅法的字节码加密,使用Java Agent技术以及重写Java类加载器,在运⾏时通过java agent机制在native层解密java⽅法中的字节码,再传递给jvm编译⽣成机器指令执⾏。

DS保护方式

将class文件或整个jar包加密,同时对JVM进行加壳处理,在加载受保护的class或jar文件时进行一次性解密。

安全程度#

三种保护方式安全性比较:vme > bce > ds

Java vme保护方式

  1. 运行过程:运行时跳转至自定义的虚拟机中执行,无论是静态文件还是运行时内存中,永远不会有原始字节码的暴露;

  2. 性能影响:若一些性能敏感高的方法、大量执行的方法进行代码虚拟化,则性能损耗会很高;

    对于性能敏感低的方法、代码执行低的方法进行保护,则性能损耗就不会那么高;

    所以要大量测试,挑选关键的方法进行保护,不建议所有函数全部勾选代码虚拟化。

Java bce保护方式

  1. 运行过程:保护后的Jar/war包运行时每次仅解密一个方法在内存,方法使用完后会及时交给jvm的gc去清理回收,防止从内存中获取到字节码,但若通过一些手段可能会从内存中获取到解密后的字节码。
  2. 性能影响:运行过程中的性能损耗很小。

DS保护方式

  1. 运行过程:保护后Jar/war包里的所有文件均不能直接反编译,由于程序在启动运行时就进行一次性解密,运行之后,JVM解密完就放到内存中了,这时通过一些工具就能获得解密后的字节码;
  2. 性能影响:由于只解密一次,所以对程序运行效率也几乎没有影响。

保护流程不同#

Java vme保护方式

将jar/war包直接拖入到Virbox Protector工具中,再进行保护,具体操作参考Java VME方式保护最佳实践文档。

Java bce保护方式

将jar/war包放到文件夹内,将文件夹拖入到Virbox Protector工具中,再进行保护,具体操作参考Java BCE方式保护最佳实践文档。

DS保护方式

需要确定jar/war包的运行时调用的主进程,需要使用Virbox Protector工具对主进程进行保护,再使用DSProtector工具对jar/war包进行加密保护。

举例参考:1.运行方式,java.exe -jar demo.jar2.Virbox Protector对java.exe进行加壳并开启ds按钮3.DSProtector工具demo.jar进行加密4.然后用保护后的java.exe运行保护后的demo.jar。

运行方式不同#

Java vme保护方式

保护后的jar/war包运行方式和原程序运行方式一样。

Java bce保护方式

运行保护后jar/war包时需要配置一下启动参数,启动时添加-javaagent:sjt_agent.jar参数。

DS保护方式

需要在运行环境替换保护后的主程序,才能运行保护后jar/war包。

优缺点#

保护方式优点缺点
Java VME1.安全性极高;
2.无需修改任何运行环境.
1.有一定的性能损耗;
2.有些写法(比如析构、反射等)不支持.
Java BCE1.性能损耗低;
2.无法直接反编译保护后文件的代码逻辑.
1.需要配置启动参数;
2.无法被其它Java项目引用.
DS1.性能基本无损耗;
2.无法直接反编译保护后的文件.
1.需要修改JVM运行环境;
2.安全性低,容易获取解密后的代码.