【问题标题】:Which is the correct way to delete a file so that it is not recoverable?删除文件以使其不可恢复的正确方法是什么?
【发布时间】:2018-05-14 10:20:00
【问题描述】:

目前我正在使用file.delete(),但它显示出安全风险,因为像这样删除的文件可以通过不同的方式恢复。所以请给我一个删除文件的正确方法。此处描述的安全风险由名为 Quixxi 的测试工具提供,它会检查应用程序中的任何漏洞。

【问题讨论】:

  • 当您错过运行时权限时,通常会发生安全异常。
  • 什么是“显示安全异常”? File.delete() 不会抛出任何异常。除非您在SecurityManager 下运行,否则会抛出(不是“显示”)异常*因为您没有授予自己删除文件的权限,而不是因为您所说的原因.不清楚你在问什么。
  • 我不明白你所说的 是什么意思......因为像这样删除的文件可以通过不同的方式恢复"。你是说抛出一个运行时异常说明这个吗?或者这是某种代码检查器产生的警告?
  • 有一个简单的警告,但是当我使用 Quixxi 漏洞测试时,我发现这个 file.delete() 是一个高安全威胁。还发现可以使用某些已删除的方法恢复文件。此外,我没有收到任何错误或异常,并且我已获得所有读写权限。如果你们中的任何一个人曾经使用过这样的测试工具,那么你们就会知道。不过谢谢。

标签: java android file


【解决方案1】:

“已删除”文件可恢复的原因是删除操作只是取消了文件系统中的文件的链接,因此目录不再认为该文件是其中的一部分。磁盘(或任何存储)上的内容仍然存在于该设备上。

如果要保证内容永远无法恢复,则必须先覆盖内容。没有内置函数可以做到这一点——你必须找到一个库或自己编写代码。通常,您会在文件上写全 0(确保刷新到媒体),写全 1,写 01 重复的模式,10 重复,类似的东西。在您将垃圾模式写入媒体(刷新)几次之后,您发出删除。

【讨论】:

  • 我同意这一点,但仍有一些应用程序可以安全和永久删除。他们如何保证这一点。他们是否也如您所说的那样覆盖数据。
  • 是的,这就是执行安全删除的程序正在做的事情,在“删除”文件之前用多个垃圾模式覆盖文件内容。
【解决方案2】:

不幸的是,在 JRE 中不可能。 JVM 不是为此而设计的,您需要依赖于操作系统的实用程序。

user1676075 的回答包含错误。让我们一步一步来。

正如已经指出的,Java 的File.delete 方法只会取消链接文件,而将其内容保留在磁盘上。它实际上调用底层操作系统 API 来执行此取消链接操作。

当您要覆盖 Java 中的内容时会出现问题。

Java 可以打开文件进行覆盖,但会利用操作系统实用程序来执行此操作。操作系统可能会:

  1. 取消链接磁盘上分配的空间
  2. 将文件链接到磁盘的新空闲区域

结果是你现在正在写大量的零……在别的地方!!! 即使您设法在原始文件使用的相同扇区上写入零,Gutmann method 的存在也是有原因的。 Gutmann 实用程序需要 root/管理员(超级用户)权限和直接 DMA 访问权限才能精确控制必须在何处进行写入。

有了 SSD,事情就发生了变化。实际上,它可能会变得更容易!在这一点上,我应该为具有 CLEAR 指令的 SSD 提供源代码,以用零替换扇区,并且保护隐私的磁盘控制器会这样做。但也许可以假装你什么都没读。

目前这已经是一个足够的答案,因为我们已经证明没有开箱即用的直接方法可以安全地在 Java 中清除文件

Java 允许并称为Java Native Interfaces(另请参阅Java Native Access)的方法是从Java 调用本机代码。那么,你准备好 C++ 中的 Gutmann 工具了吗?你在运行root吗?您可以编写代码来调用 Java 中的 Gutmann 式擦除,但这是另一回事。

从未尝试过,但肯定可行

【讨论】:

    猜你喜欢
    • 2010-10-04
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多