Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用自定义类加载器加载安全类_Java_Security_Classloader_Javassist - Fatal编程技术网

Java 使用自定义类加载器加载安全类

Java 使用自定义类加载器加载安全类,java,security,classloader,javassist,Java,Security,Classloader,Javassist,我们正在创建一个基于javassist的自定义类加载器,在加载时修改一些类的字节码。项目的一部分也是一个包含安全提供者的签名jar 加载程序的初始化如下所示: private final Loader initLoader(ClassLoader master) { final ClassPool pool = ClassPool.getDefault(); final Loader loader = new Loader(master, pool); try {

我们正在创建一个基于javassist的自定义类加载器,在加载时修改一些类的字节码。项目的一部分也是一个包含安全提供者的签名jar

加载程序的初始化如下所示:

private final Loader initLoader(ClassLoader master) {
    final ClassPool pool = ClassPool.getDefault();
    final Loader loader = new Loader(master, pool);
    try {
        loader.addTranslator(pool, new MyTranslator());
    } catch (Exception e) {
        e.printStackTrace();
    }
    return loader;
}
MyTranslator
类进行修改,但不关心与安全相关的类。
master
是系统(父)类加载器

当应用程序在加载相关安全类时到达部件时,会引发此异常:

Caused by: java.security.NoSuchProviderException: JCE cannot authenticate the provider EXAMPLE-PROV
    at javax.crypto.JceSecurity.getInstance(JceSecurity.java:100) ~[?:1.8.0_121]
    at javax.crypto.KeyAgreement.getInstance(KeyAgreement.java:230) ~[?:1.8.0_121]
    at my.example.app.security.ExampleKeyAgreement.generateSharedSecret(ExampleKeyAgreement.java:56) ~[?:?]
    ... 22 more
Caused by: java.util.jar.JarException: Class is on the bootclasspath
    at javax.crypto.JarVerifier.verify(JarVerifier.java:286) ~[?:1.8.0_121]
    at javax.crypto.JceSecurity.verifyProviderJar(JceSecurity.java:159) ~[?:1.8.0_121]
    at javax.crypto.JceSecurity.getVerificationResult(JceSecurity.java:185) ~[?:1.8.0_121]
    at javax.crypto.JceSecurity.getInstance(JceSecurity.java:97) ~[?:1.8.0_121]
    at javax.crypto.KeyAgreement.getInstance(KeyAgreement.java:230) ~[?:1.8.0_121]
    at my.example.app.security.ExampleKeyAgreement.generateSharedSecret(ExampleKeyAgreement.java:56) ~[?:?]
我的问题是,是否有一种方法可以在不违反java安全机制的情况下从自定义类装入器装入这些类

方法
javassist.Loader#setDomain(ProtectionDomain)

如果未注册适当的保护域,此加载程序加载的程序将无法与安全管理器或已签名的jar文件一起工作

如何创建或确定有效的
ProtectionDomain
实例