代码之家  ›  专栏  ›  技术社区  ›  ElectRocnic

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

  •  2
  • ElectRocnic  · 技术社区  · 6 年前

    问题: 如何在Java中强制覆盖系统内存- 更具体地说: 当安全密钥在内存中的停留时间不能超过几秒时:无论是在jvm内存中,还是在OS内存中?

    我试过的: 修改java垃圾收集器实现,这样它就可以用随机字节覆盖对象,而不仅仅是释放它们。然而:

    我所读到的一切 System.gc() 向我表明,我永远不能真正依赖它,一个人不应该在生产中使用它。但是,如果我知道我使用了一个特定的JVM怎么办?如果我知道我想在Java 11中使用OpenJDK,并且我将JVM配置为使用特定的GC实现(不让JVM选择GC),该怎么办?

    问题1: 那我能不能确定 系统.gc() 会100%触发垃圾回收吗?

    问题2: 我能查一下吗 最大持续时间 之间 系统.gc() 已经调用,实际的垃圾收集将开始?这是问题的重要部分!我只能找到垃圾收集效率本身的答案(例如吞吐量与停止世界暂停时间之比),但那就是 不是 这个问题的答案。(通读全文) documentation here )

    问题3: 如果使用修改后的垃圾收集器的想法是安全地覆盖内存中每次出现的各种可感知java对象的最糟糕的想法,那么我如何才能覆盖内存中的这些对象呢?Java甚至可以做到这一点吗?能够在Java代码中直接删除和覆盖这些对象会很好,类似于在C/C++中释放对象。 在java之外是否还有其他的可能性,我可以覆盖内存中每次出现的此类敏感信息,这些信息必须在java对象不再使用时立即触发?

    我目前的研究:

    如你所见,除了官方文件外,这些文件已经很旧了,所以:

    问题4: 是否有新的见解可供关注 系统.gc() 像10年前一样吗??谢谢!

    *编辑: 我已经在可以使用字节数组的情况下使用了字节数组。问题是关于具有各种不同字段和属性的更复杂的Java对象,这些对象必须在内存中完全清除。

    1 回复  |  直到 6 年前
        1
  •  4
  •   Karol Dowbecki    6 年前

    假设您可以将安全密钥存储在 byte[] 或其他基元数组在读取密钥后,应该足以使数组归零:

    for (int i = 0; i < key.length; i++) {
      key[i] = 0;
    }
    

    以上结果将导致 byte[] key 完全被覆盖。在这里依赖GC是一个错误,因为它是不可预测的。