当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何锁定已编译的Java类以防止反编译?》经验,为你挑选了5个好方法。

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

我知道这必须是互联网上讨论得很好的主题,但在提到之后我无法得出任何结论.

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

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

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



1> Roland Tepp..:

一些更高级的Java字节码混淆器不仅仅是类名称修改.例如,Zelix KlassMaster也可以以一种非常难以理解的方式来扰乱你的代码流,并且可以作为优秀的代码优化器工作......

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

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

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

在任何情况下你都要记住,正如俗话所说的爱沙尼亚语"Locks for for animals".这意味着在运行期间每一段代码都可用(加载到内存中)并且给予足够的技能,决心和动力,人们可以并且将会反编译,解读和破解您的代码......您的工作只是让过程变得不舒服你可以并且仍然保持工作......


+1为"锁定动物".我想这里适当的术语是脚本小子.

2> Erlend Halvo..:

只要他们可以访问加密数据和解密它的软件,基本上没有办法让你完全安全.之前已经解决的方法是使用某种形式的外部黑匣子来处理加密/解密,例如加密狗,远程认证服务器等.但即便如此,鉴于用户可以完全访问他们自己的系统,这只能做事情困难,而不是不可能 - 除非您将产品直接绑定到存储在"黑匣子"中的功能,例如在线游戏服务器.



3> Daren Thomas..:

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

这听起来像个坏主意:你让某人用你给他的"隐藏"密钥来加密东西.我不认为这可以保证安全.

也许非对称键可以工作:

使用公钥部署加密许可证进行解密

让客户创建新许可证并将其发送给您进行加密

将新许可证发回客户端.

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

您可以为每个客户保留一个单独的公钥/私钥对,以确保您确实从正确的客户那里获得了东西 - 现在负责按键...


我之前使用过这种技术并且工作正常.但是,从攻击的角度来看,第一种方法是修改执行许可证检查的代码并将其删除.你可以采取一些措施来使这种攻击向量更难,但是如果你让攻击者控制硬件,那么你的注定会失败并且有一个适当的动机和熟练的攻击者.在实践中,目标只是保持大多数诚实的人,诚实.

4> Daren Thomas..:

无论你做什么,都可以"反编译".哎呀,你可以把它拆开.或者查看内存转储以查找常量.你看,计算机需要知道它们,所以你的代码也需要.

该怎么办?

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



5> Stu Thompson..:

@jatanp:或者更好的是,他们可以反编译,删除许可代码并重新编译.使用Java,我并不认为这个问题有一个适当的,防黑客的解决方案.即使是一个邪恶的小加密狗也不能用Java阻止它.

我自己的商业经理担心这一点,我想太多了.但话说回来,我们将我们的应用程序出售给那些倾向于遵守许可条件的大型企业 - 由于豆类柜台和律师,这通常是一个安全的环境.如果您的许可证写得正确,则反编译的行为可能是非法的.

所以,我不得不问,你真的需要强化保护,就像你正在寻求你的申请?您的客户群是什么样的?(企业?或者是青少年玩家群众,这会是一个更大的问题?)

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有