【发布时间】:2015-03-07 05:20:01
【问题描述】:
我正在使用 Java AES 加密
SecretKeySpec(byte[] key, String algorithm)
生成一个 Key 对象。
加密后,我想从内存中删除密钥。
我可以删除对密钥的所有引用,但这并不能保证密钥不会在内存中的某个位置浮动。
我可以将用于生成密钥的 byte[] 数组“清零”,但是如何清零或刷新实际的密钥内存。
【问题讨论】:
-
AFAIK,没有办法显式告诉 java 的 GC 清理特定对象,也没有办法显式调用它。您只能通过请求完成来提供提示。我想您可以通过调整 GC 的激进程度来减少它在内存中可能花费的时间,但除此之外,我认为这是不可能的。这是一篇关于 GC 调优的博文,可能会有所帮助:cubrid.org/blog/dev-platform/…
-
@MarkW,垃圾收集无论如何都不会清零关键材料。它只会使该内存可供可能以后重新使用。事实上,即使有一个方法可以将 Key 对象归零,GC 仍然是个问题,因为它可能在调用 zeroize 方法之前就已经移动了对象,这样会在旧版本中留下密钥材料的副本位置。
-
@jameslarge 同意...我怀疑唯一的方法可能是用一些任意值实际填充可用内存,然后立即进行 GC,但这是一个可怕的解决方案。我将不得不关注这个问题,看看是否有其他人知道实现它的真正方法。
-
在构造函数中使用 byte[] 的目的似乎是用于生成密钥的对象可以归零,但是密钥仍然在内存中浮动。我不想在之后再调用 GC,因为那不会保证任何东西,而且会很慢。
标签: java memory encryption aes symmetric-key