繁体   English   中英

如何从代码中安全删除Java中的对象?

[英]How can I securely delete an object in Java from code?

在Java中,当有需要安全处理的对象时,有哪些选择?

考虑到:

a)时间 :您需要保证何时处置物体。 调用System.gc()是唯一/更好的选择吗?

b)方法 :GC不够,您需要确保正确擦除了对象实例正在使用的内存。 首先可以通过反射(在字符串内获取char [])获取对内部对象表示的引用,然后覆盖数据。 但是,此方法需要为每种类型的对象实现。

是否有更好的方法来确保密码和私钥对象不留在RAM中?

更新 :密码是一个示例。 这个问题集中在对象安全销毁的一般方法上。 考虑一下BigInteger,PGPPrivateKey,RSAWhatever等。

免责声明:这使用反射,可能不是最好的方法。

但是,此方法需要为每种类型的对象实现。

不,不是。 您可以遍历字段并销毁它们,甚至遍历整个对象图。 要执行的第一步是图元和图元数组,并消除对象引用,这些对象引用是您要“切碎”的对象的字段。 实际上,可以通过空检查来递归地完成最后一步。

我会用掉堆内存,这样它就不会出现在任何堆转储中,也不会被复制(即使您清除char []仍然可以读取旧副本),一旦覆盖,就知道在哪里成为某个地方的另一个副本。

由于必须处理原语,因此很难使用堆外内存,但是很容易将其清零,因为您可以覆盖其中的所有内容。

您不能依靠垃圾回收从内存中删除对象; 调用System.gc()不会导致gc运行-只是“很好地询问”。 它可能会在内存中徘徊一段时间。

标准方法是使用可以在处置之前擦除的对象,例如char[]而不是String

char[] password = <read password from input stream etc>
// check password
Arrays.fill(password, 'x');
// password available for gc, but now wiped

这只会减少密码在内存中的时间。 它并没有消除它。 如果有人在正确的时间进行了内存转储,他们也许能够找到这些字节。 如果您很好地保护了服务器的安全性,那么从一开始就很难实现转储。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM