好的,我正在尝试为我的 Java 类文件添加安全性。我不希望它被反编译。所以我所做的是创建了一个登录系统,Java 应用程序通过 Web 请求对其进行检查。如果登录信息正确,那么它将运行脚本。但是,我想进一步提高安全性并在线托管类文件。
如何让它下载并运行在线托管文件?
此外,当应用程序/脚本停止运行或关闭时,.class 文件将被删除。
我更喜欢不必下载文件的地方,只需从在线服务器获取并编译/运行。
好的,我正在尝试为我的 Java 类文件添加安全性。我不希望它被反编译。所以我所做的是创建了一个登录系统,Java 应用程序通过 Web 请求对其进行检查。如果登录信息正确,那么它将运行脚本。但是,我想进一步提高安全性并在线托管类文件。
如何让它下载并运行在线托管文件?
此外,当应用程序/脚本停止运行或关闭时,.class 文件将被删除。
我更喜欢不必下载文件的地方,只需从在线服务器获取并编译/运行。
让我们来看看你做过的事情,以及你打算做的事情,看看它们是否真的有效:
curl
or重放请求wget
并捕获下载的类文件。并且变体也相对容易被击败:
底线是,不可能阻止熟练和坚定的人击败依赖于对控制他/她自己的执行平台的用户保密的安全方案。
您能做的最好的事情就是阻止低技能的攻击者,并减慢熟练的攻击者的速度。你需要问问自己……真的值得付出努力吗?
(注意:无论您使用哪种实现语言,都会遇到同样的问题。)
创建一个新的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
提供了如何执行此操作的示例。