JVM 是否可以在关闭时覆盖其所有内存



我正在开发一些处理内存中秘密数据的应用程序。有没有办法确保在 JVM 终止时覆盖所有内存?JVM 终止后,不应将任何机密数据保留在内存中。

简短的回答:当前一代的JVM不能保证这一点。

但是,如果您的应用程序需要这种东西,则很难看出如何在典型的现代操作系统上以任何编程语言实现它,除非您在没有交换设备的情况下运行。 即便如此,您也可能需要依靠操作系统在程序退出时将物理内存归零。 (除非有错误,否则操作系统将其提供给另一个进程之前应将内存归零,但我认为在发生这种情况时没有指定它。

但这毫无意义。 操作系统应防止未经授权的人员/进程在程序执行期间或退出后看到其他进程的内存。 如果您的系统已被黑客入侵以获得"root"权限或同等权限,则无法保证其中任何一个。 所以当程序退出时,已经太晚了!

不能在 JVM 终止时删除所有密钥数据。在压缩收集器(即所有现代收集器(的情况下,它可以将数据从一个位置复制到另一个位置。因此,当您覆盖数组时,数据仍将存在于旧位置,但您将没有任何对它的引用,因此无法覆盖它。

您能做的最好的事情是覆盖当前位置(如果将数据存储在数组中(并将其保留在内存中尽可能短的时间,以最大程度地减少机密数据在压缩期间保留在堆中的可能性(但您无法 100% 避免它(。

最新更新