Encrypting a JAR where source protection is a priority
我左右为难。基本上,我给了一组我朋友的人一个程序,它使用的源代码我不希望任何人知道。我们都知道Java在做任何程度的混淆方面都是绝对可怕的,因为大多数混淆工具只重命名对象、扰码等。我使用过这样的工具,但老实说,我希望尽可能地使用程序的安全性。
由于应用程序需要用户名、密码和其他标识符才能登录到它使用的服务器,所以我开始怀疑是否可以为用户生成唯一的aes密钥来保护jar。
基本上,在运行某种类型的启动程序登录时,启动程序应用程序可以从服务器请求一个aes密钥,并使用它来解密已经从服务器下载的安全jar。密钥对于每个用户都是完全唯一的,这意味着服务器必须为每个用户对JAR进行不同的加密。
现在,我知道这听起来有多疯狂。但是由于这是一个低级的东西,我需要知道是否有一种方法可以同时解密和运行来自任何类型流的jar。或者,如果这是不可能的,那么解密文件、运行文件、然后重新加密文件是否合理?
当然,您可以在诸如ASM这样的字节码操作库上解密和运行Java字节码,甚至可以动态创建新的类。
但是,老实说,如果某个东西真的在一台计算机上运行,那么它的代码肯定会提供给任何有知识的人。Java尤其是更方便,因为它可以更好地访问由JVM加载的类的字节码,而不是任何本地编译的语言。
理论上,您可以通过使用JNA/JNI和一两个本地共享库来进一步模糊您的理解。但是,在一个坚定的攻击者手中,没有任何措施可以完全保护您的代码——让他们花更多的时间来了解您的算法是如何工作的。如果你担心盗版,那么,我们正处于虚拟化的时代;你可以通过几次按键从上到下复制整个计算机系统-你可以计算出其余的…
唯一可能可行的解决方案是将您的软件作为一种服务来提供,这种方法所涉及的所有问题——您仍然没有绝对的安全性。
如果你担心保护你的知识产权,那么找个律师,考虑以某种形式发布你的算法——默默无闻只会持续这么久。它不会阻止某人对您的系统进行黑盒分析,而且通常只知道有什么可能是足够的。
请不要试图找到一个明显不属于技术性质的问题的技术解决方案…
我的答案是将服务器信息完全保留在JAR之外。使用参数或配置文件指向获取该信息的位置。那么JAR文件中就没有秘密了。只有运行代码的服务器才有这些信息。然后,您可以做一些事情,比如使配置文件仅由能够在JAR中运行代码的用户可读。