我正在使用Java加密
SecretKeySpec(byte[] key, String algorithm) 要生成关键对象,请执行以下操作。
加密后,我想从内存中删除密钥。
我可以删除对键的所有引用,但这并不保证键不会在内存中浮动。
我可以“清除”用于生成键的byte[]数组,但我如何才能将实际的键内存清零或刷新。
发布于 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反射副本(尽管它是私有的)。
发布于 2015-03-06 21:19:31
如果您无法使用Java 8,那么您就需要有一点创造性。也就是说,为这项工作选择正确的工具。在这种情况下,我建议C. C允许您完全访问实际内存;Java抽象了几乎所有这些。因此,解释如下:
正如评论中所指出的,出现了更多的实现级细节。这个答案的目的是强调,其他语言做的更好,它可能值得研究。
https://stackoverflow.com/questions/28907297
复制相似问题