我是否可以缓存java.security.PrivateKey对象,这样我就不必通过从私钥文件读取来创建私钥,从而获得更好的性能
java.security.PrivateKey是线程安全的吗?我必须为每个请求验证数字信号,所以我在想,一旦我从物理位置加载私钥文件,在将其转换为java.security.PrivateKey后,是否可以缓存它,这样我就不必每次都创建私钥我是否可以缓存java.security.PrivateKey对象,这样我就不必通过从私钥文件读取来创建私钥,从而获得更好的性能,java,security,encryption,cryptography,Java,Security,Encryption,Cryptography,java.security.PrivateKey是线程安全的吗?我必须为每个请求验证数字信号,所以我在想,一旦我从物理位置加载私钥文件,在将其转换为java.security.PrivateKey后,是否可以缓存它,这样我就不必每次都创建私钥 private PrivateKey privateKey; private PrivateKey getPrivateKey(byte[] keyFileBytes) throws Exception { PKCS8EncodedKeyS
private PrivateKey privateKey;
private PrivateKey getPrivateKey(byte[] keyFileBytes) throws Exception {
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyFileBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
this.privateKey=kf.generatePrivate(spec);
}
PrivateKey
是一个接口,所以您应该询问PrivateKey的具体实现是否是线程安全的,但它可能取决于您使用的安全提供程序。可能会有帮助。创建密钥真的那么慢吗?或者它真的是从一个缓慢的文件中读取keyFileBytes
?您是否尝试缓存字节并查看是否仍然存在性能问题?字节肯定是线程安全的,对吗?正如其他人所评论的,这取决于实现。我看到的所有实现基本上都是不可变的,因此是线程安全的。但是,契约并不能保证这一点,因此实际上您应该假设不需要,并使用锁定来确保序列化访问。然而,为了提高性能,您可能会选择为每个线程创建一个副本,这消除了任何可能的争用。感谢Michalk、Andreas和James。我将Privatekey保留为实例变量,但将sign方法设置为同步以避免任何问题。