Java:URLClassLoader将已加载的类保留在临时目录中

4
我正在尝试使用URLClassLoader从web中加载jar文件,所有内容都运行良好,但是所有已加载的类都会存储在Windows临时目录中,并且可以通过复制进行解混淆,直到我调用classLoader.close();之后才会导致程序ClassNotFoundException.

我能否在不保存到磁盘的情况下加载类?

(仅内存)另一种解决方案是加密jar类,并编写自定义的ClassLoader来解密类,但我找不到任何示例。

我试图查找有关此主题的文档或文章,但没有找到任何信息 :(

请告诉我是否可以实现以及我可以在哪里获取有关该主题的材料?谢谢!


如果代码具有敏感性(代码也像数据一样具有敏感级别),那么您需要将其保存在您控制的服务器上。它不应该在潜在攻击者控制的台式机或设备上本地可用。 - jww
2个回答

2
你应该意识到,任何有权访问你所运行代码机器的人都可以获取到自定义类加载的代码,对吧?这意味着他们可以简单地反编译该类本身并使其写出解密后的类,使整个过程变得毫无意义。确实,大多数人不会知道如何操作,但是这是可能的。
如果你真的必须这样做,我的建议是仅对代码进行混淆。担心别人获取你的库并不能带来太大帮助,因为除非你使用迷惑反编译器的代码结构(或者Jad等工具不支持的特性,从而导致它们生成严重错误的反编译代码),否则几乎无法保护它免受反编译。只要有足够的知识和动机,任何人都会想出办法来做这件事。

1
我不知道除了混淆之外还有什么可靠的保护方式,但这种保护与代码混淆完全相同,只会减慢反编译的过程。 - Draiget
我理解Java是开放的,任何用它编写的库也必须如此。如果Java中的二进制文件旨在加密,则反编译代码不会比C++世界中容易得多。我认为Java希望开发人员通过许可证来保护代码。只需看看Java开始变得如此主流后几年出现的许可证繁荣即可。这些许可证中很多与Java项目非常相关(尽管措辞非常通用)。 - carlspring

1

创建自己的ClassLoader,从网络中检索类非常简单。在Java文档示例Classloader中:

class NetworkClassLoader extends ClassLoader {
     String host;
     int port;

     public Class findClass(String name) {
         byte[] b = loadClassData(name);
         return defineClass(name, b, 0, b.length);
     }

     private byte[] loadClassData(String name) {
         // load the class data from the connection
          . . .
     }
 }

你只需要实现loadClassData函数,其他的都已经为你处理好了。在这个loadClassData函数中,你可以进行加密或其他操作。

是的,你可以将jar文件读入内存并从中加载类,但仍然有人可以反编译你的类、逆向工程它、重新编译它并用他们自己的自定义类加载器替换你的。这真的只是徒劳无功。对于那些知道他们在做什么的人来说,只要有足够的动力,他们就会破解它。 - carlspring

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接