1

好的,我正在尝试为我的 Java 类文件添加安全性。我不希望它被反编译。所以我所做的是创建了一个登录系统,Java 应用程序通过 Web 请求对其进行检查。如果登录信息正确,那么它将运行脚本。但是,我想进一步提高安全性并在线托管类文件。

如何让它下载并运行在线托管文件?

此外,当应用程序/脚本停止运行或关闭时,.class 文件将被删除。

我更喜欢不必下载文件的地方,只需从在线服务器获取并编译/运行。

4

2 回答 2

5

让我们来看看你做过的事情,以及你打算做的事情,看看它们是否真的有效:

  • 要求输入密码。这很容易击败:
    1. 捕获类文件。
    2. 反编译它。
    3. 确定进行远程调用的位置进行登录检查,并检查响应。
    4. 修改字节码以删除所有这些。
  • 无需安装类文件,而是按需下载并在完成后将其删除。也很容易被打败。
    1. 捕获下载文件的网络请求。
    2. 使用 (say) curlor重放请求wget并捕获下载的类文件。
    3. 如上进行。

并且变体也相对容易被击败:

  • 混淆最终总是可以通过手动反编译和/或使用调试器运行字节码来解决。
  • 通过对过程进行逆向工程并在使用一次性密钥之前提取一次性密钥,可以击败使用一次性密钥或其他方式进行下载。
  • 加密字节码可能会失败,因为 JVM 必须在某些时候将字节码解密为解密形式。因此,字节码的解密手段必须嵌入在可以被逆向工程的代码中。

底线是,不可能阻止熟练和坚定的人击败依赖于对控制他/她自己的执行平台的用户保密的安全方案。

您能做的最好的事情就是阻止低技能的攻击者,并减慢熟练的攻击者的速度。你需要问问自己……真的值得付出努力吗?

(注意:无论您使用哪种实现语言,都会遇到同样的问题。)

于 2013-04-20T01:02:32.617 回答
1

创建一个新的URLClassLoader(“默认”Java 类加载器)并将其指向您保存文件的位置:

// the directory where you're saving the .class file
File tmpDir = new File("/tmp/yadda/blah/");
ClassLoader cl = new URLClassLoader(new URL[] { tmpDir.toURI().toURL() }, Thread.currentThread().getContextClassLoader());
Class<?> cls = cl.loadClass("SuperSecretClass");
// use reflection to instantiate cls, call methods, etc.

(在非 web 应用程序中可能不需要传入父类加载器,但我懒得测试那个细节。显式使用线程的类加载器会以一种或另一种方式工作。

这假设您的秘密类不在包中,如果是,则必须在临时目录中创建适当的目录结构,并将类加载器指向包树的根目录,就像往常一样。

另外:这种隐蔽的安全性听起来是个坏主意。您仍在下载文件,如果它通过不安全的连接,确定的攻击者可以嗅探它,并且仍然有一段时间它在磁盘上。您可以创建一个ClassLoader直接读取流的完全自定义,但即使是类文件也可能需要更多的努力才能恢复。(就像将调试器指向您的主应用程序并拦截流读取一样。)javadoc forClassLoader提供了如何执行此操作的示例。

于 2013-04-20T00:34:42.983 回答