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