首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java中从内存中“零”出AES SecretKeySpec密钥

问如何在Java中从内存中“零”出AES SecretKeySpec密钥
EN

Stack Overflow用户
提问于 2015-03-06 20:42:37
回答 2查看 2.5K关注 0票数 4

我正在使用Java加密

代码语言:javascript
复制
SecretKeySpec(byte[] key, String algorithm) 

要生成关键对象,请执行以下操作。

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

我可以删除对键的所有引用,但这并不保证键不会在内存中浮动。

我可以“清除”用于生成键的byte[]数组,但我如何才能将实际的键内存清零或刷新。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-06 21:14:42

在Java版本最多为7的情况下,似乎没有一种方法可以做到这一点,但是通过添加Destroyable接口,已经修复了Java8。

请参阅https://bugs.openjdk.java.net/browse/JDK-6263419

通过增强java.security.PrivateKey和javax.crypto.SecretKey类来扩展javax.security.auth.Destroyable接口来满足这一需求。

不过,请注意以下评论:

清除BigInteger或byte[]引用并不能保证敏感信息从内存中消失。操作系统的虚拟内存可能已被交换到磁盘,例如,在本地硬盘上留下一份副本。此外,Java运行时VM本身可能有多个内部信息副本。

还请注意,将原始字节数组归零不会清除SecretKeySpec,因为它获取字节数组在构造函数中的副本。

但是,您可能可以使用SecretKeySpec来更改对该字段的访问,从而访问字节数组的Java反射副本(尽管它是私有的)。

票数 4
EN

Stack Overflow用户

发布于 2015-03-06 21:19:31

如果您无法使用Java 8,那么您就需要有一点创造性。也就是说,为这项工作选择正确的工具。在这种情况下,我建议C. C允许您完全访问实际内存;Java抽象了几乎所有这些。因此,解释如下:

正如评论中所指出的,出现了更多的实现级细节。这个答案的目的是强调,其他语言做的更好,它可能值得研究。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28907297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档