我正在使用
进行Java AES加密SecretKeySpec(byte[] key, String algorithm)
生成Key对象。
加密后,我想从内存中删除密钥。
我可以删除对Key的所有引用,但这并不能保证密钥不会浮动到内存中的某个位置。
我可以"归零"我用来生成Key的byte []数组,但是如何将实际的Key内存清零或刷新。
答案 0 :(得分:2)
在最多7个Java版本中似乎没有办法实现这一点,但是通过添加Destroyable
接口已经为Java 8修复了它。
请参阅https://bugs.openjdk.java.net/browse/JDK-6263419
通过增强java.security.PrivateKey和来增加此要求 javax.crypto.SecretKey类扩展了 javax.security.auth.Destroyable接口。
但请注意评论:
清除BigInteger或byte []引用并不能保证 敏感信息从记忆中消失了。操作系统 虚拟内存可能已经交换到磁盘,例如,留下一个 复制在本地硬盘上。此外,Java运行时VM可以 本身有多个内部信息副本。
另请注意,将原始字节数组清零不会清除SecretKeySpec,因为它需要字节数组in its constructor的副本。
但是,您可以使用Java Reflection更改对该字段的访问权限来访问字节数组的SecretKeySpec副本(即使它是私有的)。
答案 1 :(得分:1)
如果您无法使用Java 8,那么您需要有点创意。即,为工作选择正确的工具。在这种情况下,我建议C. C让您完全访问实际内存; Java几乎将所有这些都抽象出来。所以解释如下:
正如评论中指出的那样,会出现更多的实施级别细节。这个答案的重点是强调其他语言做得更好,可能值得研究。