防止操作系统将对象交换到Java中的虚拟内存/磁盘?

防止操作系统将对象交换到Java中的虚拟内存/磁盘?,java,virtual-memory,Java,Virtual Memory,所以我有一个程序,让用户输入一个密码短语。在覆盖密码之前,我只在char[]中保存密码短语几秒钟,但我想知道Java中是否有办法防止操作系统将该位交换到磁盘/虚拟内存/比RAM更永久的存储?关于这个话题的研究似乎说不,没有一个方法,但没有一个地方给了我一个直接的答案。我也不确定是否可以通过以某种方式使用mlock()或通过保持对该值的引用处于活动状态直到不再需要它来实现这一点 谢谢 您需要做的是:使用char[]存储密码。当您使用完密码后,只需用0重写数组,这样,如果攻击者试图扫描所有内存以查找

所以我有一个程序,让用户输入一个密码短语。在覆盖密码之前,我只在
char[]
中保存密码短语几秒钟,但我想知道Java中是否有办法防止操作系统将该位交换到磁盘/虚拟内存/比RAM更永久的存储?关于这个话题的研究似乎说不,没有一个方法,但没有一个地方给了我一个直接的答案。我也不确定是否可以通过以某种方式使用mlock()或通过保持对该值的引用处于活动状态直到不再需要它来实现这一点


谢谢

您需要做的是:使用
char[]
存储密码。当您使用完密码后,只需用0重写数组,这样,如果攻击者试图扫描所有内存以查找密码,而Java GC在此之前还没有清除该变量,则攻击者将无法检索密码,因为您已经重写了数组本身

干杯


编辑:当内核开始使用HDD来减轻RAM上的压力时,HDD上的空间就像RAM一样,这意味着它不会永久存储提供给它的数据。

“我想知道Java中是否有办法防止将其交换到虚拟内存?”请详细说明。另外,请根据您的情况定义虚拟内存。您基本上必须使用
char[]
而不是字符串。完成后,用0或其他内容覆盖数组。并非每个API或框架都允许您传入字符[]作为密码,因此您可能对此没有选择。相关:@markspace:如果您理解OP通过虚拟内存的含义,他是否正在引用堆?对,我已经在使用
char[]
作为密码短语本身,我只是想防止操作系统将该位交换到磁盘,以减轻RAM上的压力。抱歉,我的问题不清楚,我认为操作系统使用的磁盘空间称为虚拟内存。@Drew除非您编写自己的内核,否则您不能这样做。这完全取决于操作系统想要什么。编写自定义驱动程序可能是可行的。@Drew即使内核将变量放在硬盘上,并且您使用相同的方法,也不会有什么区别,因为攻击者无法找到您的密码。如果我的答案解决了您的问题,请将其标记为您问题的答案。@Drew因为内存管理是由操作系统完成的,您不能从用户空间完成。我坚持要你读这篇关于维基百科和谷歌的文章“用户模式和内核模式”