如何在使用后从内存中清除PrivateKey数据?

时间:2013-09-19 15:02:44

标签: java cryptography rsa private-key

有没有办法从内存中删除PrivateKey的敏感信息? (不希望垃圾收集器清理?)

我是否必须编写自己的PrivateKey实施例
有没有我可以使用的东西?

2 个答案:

答案 0 :(得分:2)

如果没有原生,你就无法在常规Java中执行此操作。 JVM始终可以复制数据,RSAPrivateKey接口指定getPrivateExponent()以返回不可变BitInteger实例。这由CipherSignature类使用。使用安全令牌(例如使用Sun PKCS#11提供商)是最好的方法。

如果您认为无论您做什么都不能保证内存安全,那么使用解密或签名软件会出现严重问题。您至少需要操作系统级支持,这不是在Oracle Java实现中启用的。

答案 1 :(得分:1)

您必须确保没有任何敏感数据被放入不可变数据类型(例如,您不能使用String),因为当您完成敏感数据时,您需要能够覆盖它。 / p>

您可能会将私钥的内容保存在一个字节数组中(因为这正是getEncoded()返回的内容)。完成私钥后,用零(或其他)填充字节数组。

您可能需要实现自己的PrivateKey版本,因此可以添加此新功能(因为您不能保证提供的实现返回实际数组的别名而不是副本)。

您还需要担心getEncoded()的所有来电者,因为来电者可以保留数据的副本。