我正在尝试使用Cipher:
实施protected constructor of that classprotected Cipher(CipherSpi cipherSpi, Provider provider, String transformation)
但它失败并且NullPointerException
在该构造函数中没有任何消息。我提供了所有参数,甚至是我自己的CipherSpi
,为什么它会抛出这个异常?
答案 0 :(得分:2)
问题是在同一个构造函数中执行的安全检查。它不是抛出更精确的异常,而是抛出运行时异常:
if (!JceSecurityManager.INSTANCE.isCallerTrusted()) {
throw new NullPointerException();
}
代码来自GPL'ed source code of OpenJDK 7,从第250行开始。对于任何Oracle版本的Java SE,它都应该是相同的。
这是安全提供程序在使用之前需要签名的要求的一部分。要签署提供程序,您需要创建代码签名密钥对和从Oracle获得的证书。要了解如何获取,请查看technote: "How to Implement a Provider in the Java Cryptography Architecture"。
请注意,许多其他类可以进行扩展,但它们仍然不能成为Provider
类中受信任提供程序列表中Security
的一部分(即调用{ {1}}永远不会返回您的实现。
请注意,此限制可能不会出现在其他(非官方)Java实现中。