我正在处理一些与内存中的秘密数据一起使用的应用程序。有没有办法确保在JVM终止时覆盖所有内存?在JVM终止后,任何秘密数据都不应留在内存中。
答案 0 :(得分:6)
简短回答:当前一代JVM无法保证。
但是,如果您的应用程序需要这样的东西,很难看到如何在典型的现代操作系统上以任何编程语言实现它,除非您没有运行交换设备。即便如此,您可能还需要依赖操作系统在程序退出时将物理内存归零。 (除非存在错误,否则操作系统应该在将内存提供给另一个进程之前零内存,但我不认为在发生这种情况时会将其指定。)
但这没有实际意义。操作系统应该防止未经授权的人员/进程在程序执行期间或退出后查看其他进程的内存。如果您的系统遭到黑客入侵以获得“root”权限或同等权限,则无法保证 。所以当程序退出时,已经太晚了!
答案 1 :(得分:2)
您无法删除JVM终止上的所有机密数据。在压缩收集器(即所有现代收集器)的情况下,它可以将数据从一个位置复制到另一个位置。因此,当您覆盖数组时,数据仍然存在于旧位置,但您赢了;没有任何引用它,因此您无法覆盖它。
你能做的最好的事情是覆盖当前的位置(如果你将数据存储在数组中)并将其保存在内存中尽可能少的时间,以尽量减少机会(但你无法避免100%)在压缩过程中,秘密数据将保留在堆中。