3

我有一个难题。基本上,我为一群我是朋友的人提供了一个程序,该程序使用了我不希望组外任何人知道的源代码。我们都知道 Java 在进行任何级别的混淆时都非常糟糕,因为大多数混淆工具只能重命名对象、扰码等。我使用过这样的工具,但老实说,我想尽可能地使用程序的安全性。

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

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

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

4

2 回答 2

4

当然,您可以即时解密和运行 Java 字节码 - 字节码操作库(例如 ASM)甚至可以动态创建新类。

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

从理论上讲,您可以通过使用 JNA/JNI 和一个或两个本机共享库来进一步混淆。但是,在坚定的攻击者手中,没有任何措施可以完全保护您的代码——他们只需要更多时间来弄清楚您的算法是如何工作的。如果您担心盗版,那么我们正处于虚拟化时代;你实际上可以通过几个按键从上到下克隆整个计算机系统——你找出其余的......

唯一可能可行的解决方案是将您的软件作为一种服务提供,同时解决该方法带来的所有问题——您仍然没有绝对的安全性。

如果您非常关心保护您的知识产权,那么请一位律师并考虑以某种形式发布您的算法 - 默默无闻只会到此为止。它不会阻止某人对您的系统进行黑盒分析,而且通常只知道某事是可能的就足够了。

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

于 2013-01-01T17:50:46.830 回答
0

我的回答是将服务器信息完全保留在 jar 之外。使用参数或配置文件指向获取该信息的位置。那么这个jar文件里面就没有秘密了。只有运行代码的服务器具有该信息。然后,您可以执行一些操作,例如使配置文件只能由可以运行 jar 中代码的用户读取。

于 2013-01-02T06:51:24.940 回答