有没有办法从PrivateKey
内存中删除敏感信息?(不希望垃圾收集器清理?)
我是否必须编写自己的实现,PrivateKey
或者
是否已经有可以使用的东西?
有没有办法从PrivateKey
内存中删除敏感信息?(不希望垃圾收集器清理?)
我是否必须编写自己的实现,PrivateKey
或者
是否已经有可以使用的东西?
如果不使用本机,您无法在常规 Java 中执行此操作。JVM 总是可以复制数据并且RSAPrivateKey
接口指定getPrivateExponent()
返回一个不可变的BitInteger
实例。这由Cipher
和Signature
类使用。使用安全令牌(例如使用 Sun PKCS#11 提供程序)是最好的方法。
如果您认为无论您做什么都无法保证内存安全,那么使用解密或登录软件都会出现严重问题。您至少需要操作系统级别的支持,这在 Oracle Java 实现中是不支持的。
您必须确保没有任何敏感数据被放入不可变数据类型(例如,您不能使用 String),因为当您处理完敏感数据后,您需要能够覆盖它。
您可能会将私钥的内容保存在一个字节数组中(因为这正是getEncoded()
返回的内容)。使用完私钥后,用零(或其他)填充字节数组。
您可能需要实现自己的 PrivateKey 版本,因此您可以添加这个新功能(因为您不能保证提供的实现返回实际数组的别名而不是副本)。
您还需要担心任何调用者getEncoded()
,因为调用者可以保留数据的副本。