2

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

我是否必须编写自己的实现,PrivateKey
或者
是否已经有可以使用的东西?

4

2 回答 2

2

如果不使用本机,您无法在常规 Java 中执行此操作。JVM 总是可以复制数据并且RSAPrivateKey接口指定getPrivateExponent()返回一个不可变的BitInteger实例。这由CipherSignature类使用。使用安全令牌(例如使用 Sun PKCS#11 提供程序)是最好的方法。

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

于 2013-09-19T21:54:02.600 回答
1

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

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

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

您还需要担心任何调用者getEncoded(),因为调用者可以保留数据的副本。

于 2013-09-19T15:17:44.403 回答