目前我正在使用file.delete()
,但它显示出安全风险,因为这样删除的文件可以通过不同方式恢复。所以请为我提供一个删除文件的正确方法。此处描述的安全风险由名为Quixxi的测试工具提供,它会检查应用程序中的任何漏洞。
答案 0 :(得分:1)
“已删除”文件可恢复的原因是,删除操作只是取消文件系统中文件的链接,因此该目录不再将该文件视为其中的一部分。磁盘(或任何存储器)上的内容仍然存在于该设备上。
如果要保证内容永远无法恢复,则必须先覆盖内容。没有内置函数可以执行此操作 - 您必须自己查找库或编写代码。通常你会在文件上写一些像0一样的东西(确保刷新到媒体),写下所有的1,写一个01重复的模式,10重复,类似的东西。在使用垃圾模式向介质(刷新)写入几次之后,然后发出删除。
答案 1 :(得分:0)
不幸的是,在JRE中是不可能的。 JVM不是为此而设计的,您需要依赖于操作系统的实用程序。
user1676075
的答案有误。让我们按步骤进行。
正如已经指出的,Java的File.delete
方法仅取消链接文件,将其内容保留在磁盘上。实际上,它调用底层OS API来执行此取消链接操作。
当您要覆盖Java中的内容时,会发生问题。
Java可以打开文件进行覆盖,但是会利用OS utils进行覆盖。操作系统可能会:
结果是您现在正在其他地方写成大量的零!!! 并且即使您设法在原始文件使用的相同扇区上写入零,Gutmann method仍然存在是有原因的。 Gutmann实用程序需要root / Administrator(超级用户)权限和直接DMA访问权限,以精确控制必须在何处进行写操作。
有了SSD,情况就变了。实际上,它可能会变得更容易!在这一点上,我应该提供具有CLEAR指令的SSD的源代码,该指令将用零替换扇区,并且具有隐私保护功能的磁盘控制器可以做到这一点。但也许假装您什么都没读。
到目前为止,这将是一个足够的答案,因为我们已经证明,没有现成的直接方法可以安全地清除Java中的文件。
Java所允许的并称为Java Native Interfaces
(请参见Java Native Access)是指从Java调用本机代码。那么,您准备好使用C ++编写的Gutmann工具了吗?您正在root吗?您可以编写代码来从Java调用Gutmann式擦除,但这是另一回事。
从未尝试过,但肯定可行