如何删除文件以使删除不可逆转?

问题描述 投票:9回答:6

我想以一种文件无法恢复的方式删除敏感文件(使用C ++)。

我想只是重写文件然后删除它,是否足够或我是否必须执行更多操作?

c++ windows delete-file erase
6个回答
4
投票

这是一篇有趣的论文:

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

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


4
投票

最糟糕的情况是,你不能确定在没有物理破坏驱动器的情况下完成它。您可能正在运行日志文件系统,该文件系统会在您修改文件时保留原始文件,以便在电源故障或其他情况下中断修改时允许进行灾难恢复。这可能意味着修改文件会将其移动到物理驱动器上,从而保持旧位置不变。

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

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

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

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

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

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

甚至在您考虑某人有可能检测磁盘上的数据的特殊工具包之前,即使在被新数据覆盖之后也是如此。意见不同,这种攻击在现代磁盘上实际上是多么合理,因为现有磁盘非常密集,因此旧值的残差没有太多空间。但这是学术性的,实际上,因为在大多数实际情况下,你甚至不能确保覆盖旧数据,而不是卸载驱动器并使用低级工具覆盖每个扇区。

哦,是的,闪存驱动器并不是更好,它们执行逻辑扇区到物理扇区的重新映射,有点像虚拟内存。这样他们就可以应对失败的部门,做到磨损等等。因此,即使在低级别,仅仅因为您覆盖特定编号的扇区并不意味着将来某些其他编号扇区中不会弹出旧数据。


1
投票

0和1不是真正的0和1。剩余磁性和其他技术(我怀疑你试图保留内容的用户正在使用它们)可以用来在被覆盖后恢复数据。

看看这个entry,可能是你正在寻找的。

编辑:

为了支持我的陈述:

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


0
投票

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

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


0
投票

我认为这可能肯定有用。

首先删除文件,然后开始创建一个文件,填满光盘中的剩余空格。这将覆盖磁盘中存在的所有数据,如果删除了您创建的文件,则可以安全地说您的文件无法恢复。

创建与您要删除的文件大小相同或更少的文件不是创建单个大文件,而是最好。多次重复此操作会增加过载的数据量。


-1
投票

在覆盖之前最好先切碎数据。因此,获取内存地址并交换位置。之后再写入数据。

© www.soinside.com 2019 - 2024. All rights reserved.