对源保护优先的JAR进行加密



我进退两难。基本上,我给了一群我的朋友一个程序,这个程序利用了我不想让小组外的任何人知道的源代码。我们都知道Java在任何级别的混淆方面都非常糟糕,因为大多数混淆工具只是重命名对象、打乱代码等。我使用过这样的工具,但老实说,我想尽可能地保证程序的安全性。

由于应用程序需要用户名、密码和其他标识符才能登录到它使用的服务器,因此我开始考虑是否可以为用户生成一个唯一的AES密钥来保护JAR。

基本上,在运行各种启动器进行登录时,启动器应用程序可能会从服务器请求AES密钥,并使用它来解密它已经从服务器下载的安全JAR。密钥对于每个用户来说是完全唯一的,这意味着服务器必须为每个用户加密不同的JAR。

现在,我知道这听起来有多疯狂。但是,由于这是一种低级别的事情,我需要知道是否有一种方法可以从任何类型的流解密和运行JAR。或者,如果这是不可能的,是否合理的解密文件,运行它,然后重新加密它?

当然你可以解密并运行Java字节码——字节码操作库如ASM甚至可以动态创建新类。

但是,坦率地说,如果某件事真的在计算机上运行,那么它的代码肯定会对任何有知识的人都可用。特别是Java,它甚至更方便,因为它允许比任何本机编译语言更好地访问JVM加载的类的字节码。

理论上可以通过使用JNA/JNI和一两个本地共享库来进一步混淆。但是,在一个坚定的攻击者手中,没有任何措施可以完全保护你的代码——这只会花更多的时间让他们弄清楚你的算法是如何工作的。如果你担心盗版,好吧,我们正处于虚拟化时代;实际上,你可以用几个按键从上到下复制整个计算机系统——剩下的你自己想好了……

唯一可能可行的解决方案是将您的软件作为服务提供,包括该方法所涉及的所有问题-并且您仍然没有绝对的安全性。

如果你很关心保护你的知识产权,那么请一位律师,并考虑以某种形式发布你的算法——隐晦只能到此为止。它不会阻止某人在您的系统上做黑盒分析,而且通常只要知道某些事情是可能的就足够了。

不要再试图为一个明显不是技术性质的问题寻找技术解决方案…

我的答案是将服务器信息完全保存在jar之外。使用参数或配置文件指出从哪里获得该信息。那么jar文件中就没有秘密文件了。只有运行代码的服务器才拥有该信息。然后,您可以做一些事情,例如使配置文件仅由可以运行jar中的代码的用户可读。

最新更新