好的,我正在尝试为我的Java类文件添加安全性。我不希望它被反编译。所以我所做的就是创建一个登录系统,java应用程序通过Web请求对其进行检查。如果登录信息正确,那么它将运行脚本。但是,我希望进一步提高安全性并在线托管类文件。
如何下载&运行在线托管文件?
此外,当app /脚本停止运行或关闭时,.class文件将被删除。
我更喜欢没有下载文件的地方,只需从在线服务器上获取并编译/运行。
答案 0 :(得分:5)
让我们来看看你做过的事情,以及你想要做的事情,看看它们是否真的有效:
curl
或wget
重播请求并捕获下载的类文件。变化也相对容易失败:
最重要的是,不可能阻止熟练和坚定的人打败依赖于控制他/她自己的执行平台的用户保密的安全方案。
你可以做的最好的事情就是阻止技术含量低的攻击者,并减慢熟练的攻击者的速度。你需要问问自己......真的值得努力吗?
(注意:无论您使用何种实现语言,都会遇到同样的问题。)
答案 1 :(得分: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.
(在非webapp中传递父类加载器可能不是必需的,但是我太懒了,不能测试那个细节。显式地使用线程的类加载器会以某种方式工作。
这假定你的秘密类不在一个包中,如果你必须在临时目录中创建适当的目录结构,并像往常一样将类加载器指向包树的根目录。
另外:这种默默无闻的安全听起来像个坏主意。您仍然在下载该文件,如果它是通过不安全的连接,确定的攻击者可以嗅探它,并且仍然存在它在磁盘上的时间段。您可以创建一个直接读取流的完全自定义ClassLoader
,但即使是类文件也可以通过更多的努力来恢复。 (比如将调试器指向主应用程序并拦截流读取。)javadoc for ClassLoader
提供了如何执行此操作的示例。