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