如何锁定已编译的Java类以防止反编译?

2022-08-31 10:04:59

如何锁定已编译的 Java 类以防止反编译?

我知道这在互联网上一定是很好的讨论话题,但是在引用它们之后,我无法得出任何结论。

许多人确实建议使用混淆器,但他们只是使用难以记住的字符序列重命名类,方法和字段,但是敏感的常量值呢?

例如,您已经开发了基于密码的加密技术的加密和解密组件。现在,在这种情况下,任何普通的Java人都可以使用JAD来反编译类文件,并轻松检索密码值(定义为常量)以及salt,然后可以通过编写小型独立程序来解密数据!

或者这些敏感组件是否应该在本机代码(例如VC ++)中构建并通过JNI调用它们?


答案 1

一些更高级的Java字节码混淆器所做的不仅仅是类名重整。例如,Zelix KlassMaster还可以以一种难以遵循的方式扰乱您的代码流,并作为出色的代码优化器工作...

此外,许多混淆器还能够对字符串常量进行加扰并删除未使用的代码。

另一种可能的解决方案(不一定排除混淆)是使用加密的 JAR 文件和执行解密的自定义类装入器(最好使用本机运行时库)。

第三(可能提供最强大的保护)是使用原生的提前编译器,如GCCExcelsior JET,例如,将Java代码直接编译为特定于平台的原生二进制文件。

无论如何,你必须记住,正如爱沙尼亚语中俗话所说“锁是动物”。这意味着每一段代码在运行时都可用(加载到内存中),并且只要有足够的技能,决心和动力,人们就可以并且将会反编译,解扰和破解您的代码...你的工作只是让这个过程尽可能不舒服,并且仍然保持事情的运作......


答案 2

只要他们能够访问加密数据和解密数据的软件,基本上就无法使其完全安全。以前解决这个问题的方法是使用某种形式的外部黑匣子来处理加密/解密,如加密狗,远程身份验证服务器等。但即便如此,鉴于用户完全可以访问自己的系统,这只会使事情变得困难,而不是不可能 - 除非您可以将产品直接绑定到存储在“黑匣子”中的功能,例如在线游戏服务器。


推荐