加密一个JAR文件,保护源代码是首要任务

3
我有一个困境。基本上,我给我的一群朋友提供了一个程序,它使用了我不想让组外的任何人知道的源代码。我们都知道Java在做任何级别的混淆方面都非常糟糕,因为大多数混淆工具只是重命名对象,混淆代码等。我已经使用了这样的工具,但老实说,我想尽可能地增强程序的安全性。
由于该应用程序需要用户名、密码和其他标识符才能登录到它使用的服务器,我开始想是否可以为用户生成唯一的AES密钥来保护JAR文件。
基本上,在运行某种启动器以登录时,启动器应用程序可以从服务器请求AES密钥,并使用它来解密已从服务器下载的受保护的JAR文件。密钥对于每个用户完全是唯一的,这意味着服务器必须为每个用户以不同方式加密JAR文件。
现在,我知道这听起来有点疯狂。但由于这是如此低级的事情,我需要知道是否有一种方法可以从任何类型的流中同时解密和运行JAR文件。或者,如果这不可能,那么解密文件、运行它,然后重新加密它是否合理?

你不必将源代码放在JAR文件中... - Oliver Charlesworth
你无法加密引导代码,因为客户端必须执行它。因此,攻击者可以找出它的作用并对你的加密 jar 做同样的事情。需要付出更多的努力,但毕竟并不难。当然,攻击者必须是合法用户才能这样做。 - Henry
4
如果不可能的话,解密文件、运行它然后重新加密,这样可行吗?让有内在价值的字节码不落入潜在窃贼眼中的唯一方法是不进行分发。如果可以的话,在安全服务器上的网页界面后面隐藏它。但你会惊讶地发现,很多人仍然能够从屏幕上看到的结果编写出与你的代码相同的代码,除非它使用真正不符合直觉的算法,但这是不太可能的。 - Andrew Thompson
3
除非这是一种精神锻炼,否则你会发现这只是徒劳的练习。鉴于你需要完成的工作量,当攻击者可以“播放”你的字节码并从中推断出逻辑时,“保护”最终是无用的。 - Perception
4
更好的做法是,如果字节码在用户的机器上运行,你就输了。他们只需要将未加密的字节码复制到新文件中,所有你的混淆工作都将无用。这就是数字版权管理(DRM),当前所有形式的DRM都是失败的。 - jtahlborn
2个回答

4
当然,您可以解密并即时运行Java字节码 - 字节码操作库(如ASM)甚至可以动态生成新类。

但是,老实说,如果某个东西确实在计算机上运行,那么任何具有相关知识的人都可以获得其代码。尤其是Java,它比任何本地编译语言更方便,因为它允许更好地访问由JVM加载的类的字节码。

您可以考虑使用JNA/JNI和一两个本地共享库,从理论上讲,您可以将混淆推向更高级别。但是,在决心攻击者的手中,没有任何措施可以完全保护您的代码 - 他们只需要更长时间来弄清楚您的算法如何工作。如果您担心盗版问题,那么我们正处于虚拟化时代;您实际上可以通过按下几个键来克隆整个计算机系统 - 其余部分由您自己决定...

唯一可能可行的解决方案是将软件作为服务提供,并面临这种方法所带来的所有问题 - 即使如此,您仍然无法实现绝对安全。

如果您非常关心保护您的知识产权,请找律师并考虑以某种形式公开您的算法 - 模糊不清只有这么多作用。它无法阻止某人对您的系统进行黑盒分析,而仅仅知道某件事是“可能的”通常就足够了。

请停止尝试为明显不是技术性质的问题找到技术解决方案...


0
我的答案是将服务器信息完全保存在jar文件之外。使用参数或配置文件来指向获取该信息的位置。然后,jar文件中就没有任何秘密。只有运行代码的服务器具有该信息。然后你可以做一些事情,例如只让能运行jar文件的用户读取配置文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接