如何从内存中“清零”Java中的AES SecretKeySpec密钥

时间:2015-03-06 20:42:38

标签: java memory encryption aes symmetric-key

我正在使用

进行Java AES加密
SecretKeySpec(byte[] key, String algorithm) 

生成Key对象。

加密后,我想从内存中删除密钥。

我可以删除对Key的所有引用,但这并不能保证密钥不会浮动到内存中的某个位置。

我可以"归零"我用来生成Key的byte []数组,但是如何将实际的Key内存清零或刷新。

2 个答案:

答案 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几乎将所有这些都抽象出来。所以解释如下:

正如评论中指出的那样,会出现更多的实施级别细节。这个答案的重点是强调其他语言做得更好,可能值得研究。