[英]Java 11 - How to overwrite sensitive information in JVM- AND System-Memory (perhaps using System.gc()?)
问题:如何用Java强制覆盖系统内存- 更具体地说:当安全密钥在内存中的停留时间不得超过几秒钟时:既不在jvm内存中也不在OS-Memory中?
我尝试过的操作:修改java垃圾收集器实现,以确保使用随机字节覆盖对象,而不是仅仅释放它们。 然而:
我所读到的有关System.gc()
一切都告诉我,我永远无法真正依赖它,并且不应在生产中使用它。 但是,如果我知道我使用特定的JVM怎么办? 如果我知道我想将OpenJDK与Java 11一起使用并且我将JVM配置为使用特定的GC实现(而不是让JVM选择GC)怎么办?
问题1:然后我可以以某种方式确定System.gc()
将触发垃圾回收100%次吗?
问题2:我能否找出System.gc()
之间的最大持续时间是多少,实际的垃圾回收将开始? 这是问题的重要部分! 我只能找到垃圾收集效率本身的答案(例如,吞吐量与世界停顿的暂停时间),但这并不是该问题的答案。 ( 在此处阅读整个文档 )
问题3:如果使用修改后的垃圾收集器的想法是迄今为止最糟糕的想法,那就是安全地覆盖内存中各种明智的Java对象的每次出现,那么我又如何才能覆盖内存中的那些对象呢? Java甚至可能吗? 能够直接在Java代码中删除和覆盖这些对象,就像在C / C ++中释放对象一样,将是很好的选择? 在Java之外是否还有其他可能性,我可以覆盖内存中每次出现的此类敏感信息,一旦不再使用Java对象,就必须立即立即触发这些信息?
到目前为止,我的研究:
如您所见,除了官方文档,这些都是相当古老的,所以:
问题4:是否有任何新的见解可以关注System.gc()
行为是否与10年前一样? 谢谢!
*编辑:对于已经可以使用字节数组的情况,我已经使用了字节数组。 问题是关于具有各种不同字段和属性的更复杂的Java对象,这些对象必须在内存中完全清除。
假设您可以将安全密钥存储在byte[]
或其他原始数组中,则在读取密钥后足以将数组清零:
for (int i = 0; i < key.length; i++) {
key[i] = 0;
}
以上应该导致byte[] key
被完全覆盖。 在这里依靠GC将是一个错误,因为它是无法预测的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.