【问题标题】:URLClassLoader - Using an encrypted JarURLClassLoader - 使用加密的 Jar
【发布时间】:2012-03-23 22:18:16
【问题描述】:

我见过很多加密类加载器。如:

http://www.javaworld.com/javaworld/javaqa/2003-05/01-qa-0509-jcrypt.html?page=2

那是我正在努力适应我的需要的那个。

我基本上有一个加密的 JAR,我已将其解密为一个字节数组(“byte[] decrypt;”)。

我现在想使用那个字节数组来加载类,所以我不需要在硬盘上创建一个包含解密 jar 的文件。

我需要它来使用 URLClassLoader 而不是 ClassLoader,因为我有 ClassLoader 需要从中获取的另一个数组(“URL[] urls”)。 (除非你可以使用普通的类加载器来做到这一点?)

有什么想法吗?

【问题讨论】:

    标签: java class memory loader encryption


    【解决方案1】:

    这似乎与这篇 SO 帖子非常相似:

    Load a Byte Array into a Memory Class Loader

    我认为这里唯一的修改是利用父类加载器 - 因此,当您创建自定义类加载器的实例时,将 URLClassLoader 传递给构造函数

    public class MyClassLoader extends ClassLoader {
      public MyClassLoader(URLClassLoader parent, byte[] decryptedBytes) {
        super(parent);
        this.decryptedBytes = decryptedBytes;
      }
    
      protected byte[] decryptedBytes;
    
      public Class findClass(String name) {
        byte[] b = loadClassData(name);
        if (b != null) {
          return defineClass(name, b, 0, b.length);
        } else {
          // delegate to parent URL classloader
          getParent().findClass(name);
        }
      }
    
      private byte[] loadClassData(String name) {
        // load the class data from the connection
        // use JarInputStream, find class, load bytes ...
        . . .
      }
    }
    

    【讨论】:

    • 相似但不完全相同! :P 旧的非常适合我需要做的事情。这次我需要让它加载到内存中。此外,这个工作是一种享受 - 有点'!谢谢克里斯。 - 一个问题是getParent().findClass 方法,它似乎找不到UrlClassLoader,而是使用ClassLoader。 (除非我可以创建自己的 getParent() 方法?)
    • getParent 将返回 URLClassLoader(它扩展了 ClassLoader),因此如果需要,您可以强制转换 - 但我不明白为什么需要,如果 loadClassData 方法,findClass 方法将委托给 URLClassLoader返回 null (即它可以在解密的字节数组中找到类)。
    • 有趣的是,我最终只是投射它,效果很好。现在一切正常,感谢您的帮助!非常感谢。
    猜你喜欢
    • 2011-06-07
    • 2019-02-08
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多