繁体   English   中英

Java 11-如何覆盖JVM和系统内存中的敏感信息(也许使用System.gc()?)

[英]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.

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