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