Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JVM能否在关机时覆盖其所有内存_Java_Encryption_Jvm - Fatal编程技术网

Java JVM能否在关机时覆盖其所有内存

Java JVM能否在关机时覆盖其所有内存,java,encryption,jvm,Java,Encryption,Jvm,我正在开发一个可以处理内存中秘密数据的应用程序。有没有办法确保JVM终止时所有内存都被覆盖?JVM终止后,任何机密数据都不应留在内存中。您不能在JVM终止时删除所有机密数据。在压缩收集器(即所有现代收集器)的情况下,它可以将数据从一个位置复制到另一个位置。因此,当您覆盖阵列时,数据仍将存在于旧位置,但您赢了;没有任何引用,因此无法覆盖它 您所能做的最好的方法是覆盖当前位置(如果您将数据存储在数组中),并将其保存在内存中的时间尽可能短,以最大限度地减少机密数据在压缩过程中保留在堆中的可能性(但您无

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

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


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

简短回答:当前一代JVM无法保证这一点

然而,如果您的应用程序需要这种东西,那么很难在典型的现代操作系统上用任何编程语言实现它,除非您在没有交换设备的情况下运行。即使这样,您也可能需要依赖操作系统在程序退出时将物理内存归零。(除非有bug,否则操作系统应该在将内存分配给另一个进程之前将其归零,但我认为在这种情况下不会指定它。)


但这是没有意义的。操作系统应防止未经授权的人员/进程在程序执行期间或退出后看到其他进程的内存。如果您的系统被黑客攻击以获得“root”权限或同等权限,您无法保证这两种权限。所以当程序退出时,已经太晚了

您可以做的是将机密数据保存在数组中(例如
char[]
byte[]
),并在不再需要时立即清除这些数据。例如,这通常是处理密码的方法,但我不明白为什么它不能在更大范围内工作。机密数据通过库函数中的BufferedInputStream传递。我无法控制这部分。你的数据怎么样?有一些方法可以用来擦除内存的某些部分(以@john16384所说的最简单的形式),但是JVM没有“secure clear on exit”标志,可以执行您想要的操作。此外,如果你在谈论真正的秘密,不要试图推出自己的解决方案。不太可能通过审核。因此,在1-5的范围内,1是对树屋俱乐部的秘密攻击,5是核弹发射代码,您需要如何保护数据?在退出应用程序之前,您可以分配中等大小的阵列,直到遇到OOM。这将导致几乎所有堆都被覆盖。但即使是AIUI也不一定保证物理ram中的某个地方没有数据副本,因为内核有时可能会移动物理页面以合并大型页面。您仍然可以使用原始内存访问覆盖数据,但这里的问题似乎是库访问机密数据。