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

时间:2020-03-05 18:49:14  来源:igfitidea点击:

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

我知道这个话题必须在Internet上进行充分讨论,但是在引用它们之后我无法得出任何结论。

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

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

还是应该使用本机代码(例如VC ++)构建此类敏感组件,然后通过JNI对其进行调用?

解决方案

回答

无论我们做什么,都可以对其进行"反编译"。哎呀,你可以把它拆开。或者查看内存转储以找到常量。我们会看到,计算机需要了解它们,因此代码也需要知道它们。

怎么办呢?

尽量不要将密钥作为代码中的硬编码常量发送:将其保留为每个用户的设置。让用户负责照看该密钥。

回答

免责声明:我不是安全专家。

这听起来像是个坏主意:我们要让某人使用我们提供给他的"隐藏"密钥来加密内容。我认为这不能保证安全。

也许非对称密钥可以工作:

  • 部署带有公共密钥的加密许可证以进行解密
  • 让客户创建新许可证并将其发送给我们进行加密
  • 将新许可证发送回客户端。

我不确定,但是我相信客户端实际上可以使用我们提供给他的公钥对许可证密钥进行加密。然后,我们可以使用私钥对其进行解密,然后重新进行加密。

我们可以为每个客户保留一个单独的公钥/私钥对,以确保我们实际上是从合适的客户那里得到东西,因为我们现在负责密钥...

回答

@jatanp:或者更好,他们可以反编译,删除许可代码并重新编译。使用Java,我真的不认为有解决此问题的适当的,防黑客攻击的解决方案。甚至没有邪恶的小软件狗也无法使用Java阻止这种情况。

我自己的业务经理对此很担心,我想得太多了。但是话又说回来,我们将我们的应用程序出售给倾向于遵守许可条件的大公司,这通常是一个安全的环境,这要归功于bean柜台和律师。如果正确编写了许可证,则反编译本身就是非法的。

因此,我不得不问,我们是否真的像我们在寻找自己的应用程序一样需要加强保护?客户群是什么样的? (公司?还是青少年游戏玩家,这在哪里更成问题?)

回答

只要他们可以访问加密的数据和解密数据的软件,基本上就没有办法确保其完全安全。以前解决此问题的方法是使用某种形式的外部黑匣子来处理加密/解密,例如加密狗,远程身份验证服务器等。但是即使如此,由于用户可以完全访问自己的系统,所以这只能解决问题困难,并非没有可能-除非我们可以将产品直接绑定到存储在"黑匣子"中的功能,例如在线游戏服务器。

回答

一些更高级的Java字节码混淆器所做的不仅是类名处理。例如,Zelix KlassMaster也可以使代码流变得混乱,使其难以遵循,并且可以作为出色的代码优化器...

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

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

第三(可能提供最强大的保护)是使用本地的提前编译器,例如GCC或者Excelsior JET,这些编译器将Java代码直接编译为平台特定的本地二进制文件。

无论如何,我们都必须记住爱沙尼亚语中的俗语:"锁是为了动物"。意味着在运行时可以使用所有代码,并将其加载到内存中,并且只要具备足够的技能,决心和动力,人们就可以并且将对代码进行反编译,解密和黑化……工作就是使过程变得不那么舒服。我们可以并且仍然使事情正常进行...

回答

看看JavaWorld的文章Vladimir Roubtsov撰写的《破解Java字节码加密》。它解释了为什么对类文件进行加密几乎没有意义。

回答

如果我们正在寻找许可解决方案,则可以查看TrueLicense API。它基于非对称密钥的使用。但是,这并不意味着应用程序无法被破解。可以通过足够的努力来破解每个应用程序。正如Stu回答的那样,真正重要的是弄清楚我们需要多大的保护。

回答

我认为没有任何有效的离线反盗版方法。电子游戏行业试图找到很多次,并且他们的程序始终被破解。唯一的解决方案是该程序必须与服务器在线连接运行,以便我们可以验证lincense密钥,并且被许可方一次只能进行一个活动连接。这就是《魔兽世界》或者《暗黑破坏神》的运作方式。甚至更难的是,为它们开发了专用服务器来绕过安全性。

话虽如此,我不相信大中型企业会使用非法复制的软件,因为与之相比,它们的许可证成本极低(也许,我不知道我们要为程序收取多少费用)试用版的费用。