9

我想删除一个敏感文件(使用 C++),以使该文件无法恢复。

我正在考虑简单地重写文件然后将其删除,这是否足够或者我必须执行更多操作?

4

6 回答 6

4

这是一篇有趣的论文:

http://www.filesystems.org/docs/secdel/secdel.html

它解决了覆盖文件的一些问题。特别是您无法确定新写入的数据是否已写入同一位置,并且无法恢复仅被覆盖几次甚至一次的数据(在现代媒体上)。

于 2011-09-08T11:11:57.490 回答
4

最坏的情况是,如果不损坏驱动器,您就无法确定是否已完成此操作。您可能在日志文件系统上运行,每当您修改文件时都会保留原始文件,以便在修改因电源故障或其他原因中断时进行灾难恢复。这可能意味着修改文件会将其移动到物理驱动器上,而旧位置保持不变。

此外,一些文件系统故意尽可能长时间地保留旧版本以允许它被恢复。例如,考虑 Windows 上的影子存储副本,当您修改作为系统还原点一部分的文件的一部分的磁盘块时,新数据被写入新块,而旧数据被保留。

有用于禁用文件、目录或整个磁盘的影子存储副本的 API(不知道详细信息,可能需要管理员权限)。

另一个问题是文件系统级压缩。如果你用随机数据覆盖一个文件,即使它仍然是相同的逻辑大小,你也可能会降低它的可压缩性并因此在磁盘上更大。所以文件系统可能不得不重新定位它。我不知道 Windows 是否保证继续使用旧块来启动新的、更大的文件。如果用零覆盖,则使其可压缩,新数据可能无法到达旧数据的末尾。

如果驱动器曾经进行过碎片整理(IIRC Windows 现在默认在后台执行此操作),那么您对文件所做的任何事情都不会影响先前位置的数据副本。

shred和类似的工具在这些相当普遍的条件下根本不起作用。

延伸一点,您可以想象一个自定义文件系统,其中所有更改都被记录,备份以备将来回滚恢复,尽快复制到异地备份。我不知道有任何这样的系统(虽然当然有运行在文件系统级别之上的自动备份程序具有相同的基本效果),但 Windows 肯定没有 API 可以说,“好吧,你可以删除现在异地备份”,因为 Windows 不知道它正在发生。

这甚至在您考虑有人拥有可以检测磁盘上数据的特殊套件的可能性之前,即使它已被新数据覆盖。意见不一,这种攻击在现代磁盘上的真实性有多大,现代磁盘非常密集,因此没有太多空间用于旧值的残差。但它确实是学术性的,因为在大多数实际情况下,除非卸载驱动器并使用低级工具覆盖每个扇区,否则您甚至无法确定覆盖旧数据。

哦,是的,闪存驱动器也好不到哪里去,它们执行将逻辑扇区重新映射到物理扇区,有点像虚拟内存。这样他们就可以应对失败的扇区,进行磨损均衡之类的事情。因此,即使在低级别,仅仅因为您覆盖了特定编号的扇区并不意味着旧数据将来不会出现在其他编号的扇区中。

于 2011-09-08T11:44:32.627 回答
1

0 和 1 并不是真正的 0 和 1。剩磁和其他技术(我怀疑您试图阻止内容的用户正在使用这些技术)可用于在数据被覆盖后恢复数据。

看看这个条目,可能是你要找的。

编辑:

支持我的陈述:

恢复已在硬盘驱动器上覆盖的数据的一种标准方法是在模拟信号被数字化之前捕获和处理从驱动器的读/写磁头获得的模拟信号。该模拟信号将接近理想的数字信号,但差异将揭示重要信息。通过计算理想的数字信号,然后从实际的模拟信号中减去它,可以放大减去后剩余的信号,并使用它来确定之前写入磁盘的内容。

于 2011-09-08T11:10:33.200 回答
0

您应该使用一些随机生成的字节覆盖它,使用像样的随机数生成器或生成垃圾的加密函数。

为了确保所有内容都被覆盖,您可以多次覆盖已删除文件的相同内存区域。

于 2011-09-08T11:04:11.117 回答
0

我认为这肯定会奏效。

首先删除文件,然后开始创建一个文件,该文件将填满 disc 中的剩余空间。这将覆盖磁盘中存在的所有数据,然后如果您删除您创建的文件,那么可以肯定地说您的文件无法恢复。

最好不要创建一个大文件,而是创建多个大小相同或比您要删除的文件小一些的文件。重复多次会增加过载的数据量。

于 2019-03-23T14:23:53.880 回答
-1

在覆盖之前最好先粉碎数据。所以获取内存地址并交换位置。之后重写数据。

于 2011-09-08T11:09:53.660 回答