如何删除一个文件,使删除是不可逆转的

How to delete a file such that the delete is irreversable?

本文关键字:删除 文件 不可逆转 何删除 一个      更新时间:2023-10-16

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

我正在考虑简单地重写文件,然后删除它,这是足够的还是我必须执行更多的操作?

这是一个有趣的论文:

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

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

最坏的情况是,您无法确定是否在不物理破坏驱动器的情况下完成了操作。您可能正在运行一个日志文件系统,无论何时修改文件,它都会保留原始文件,以便在修改因电源故障或其他原因而中断时进行灾难恢复。这可能意味着修改文件会在物理驱动器上移动它,而旧位置不变。

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

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

另一个问题是文件系统级压缩。如果您用随机数据覆盖一个文件,那么您可能会使它变得不可压缩,从而在磁盘上占用更大的空间,即使它的逻辑大小仍然相同。所以文件系统可能不得不重新定位它。我不知道Windows是否保证继续使用旧块来启动新的、更大的文件。如果你用零覆盖,你使可压缩,新数据可能无法到达旧数据的末端。

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

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

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

这甚至是在你考虑到有人有特殊的工具包可以检测磁盘上的数据的可能性之前,即使它被新数据覆盖。对于这种攻击在现代磁盘上的可能性有多大,人们众说纷纭,因为现代磁盘非常密集,所以没有太多空间可以容纳旧值的残余。但这是学术的,真的,因为在大多数实际情况下,你甚至不能确定覆盖旧数据,除非卸载驱动器并使用低级工具覆盖每个扇区。

哦,是的,闪存驱动器也没有更好,它们执行逻辑扇区到物理扇区的重新映射,有点像虚拟内存。这样他们就可以处理失效的部分,做损耗平衡之类的事情。因此,即使在低级别,仅仅因为您覆盖了特定的编号扇区并不意味着旧数据将来不会在其他编号扇区中弹出。

0和1不是真正的0和1。残磁和其他技术(我怀疑你试图阻止内容的用户正在使用)可以用来恢复被覆盖的数据。

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

编辑:

来支持我的声明:

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

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

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

我想这肯定可行。

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

与其创建一个大文件,不如创建多个大小相同或比你想要删除的文件小一点的文件。多次重复此操作将增加数据量以使其过载。

最好在覆盖之前先撕碎数据。找到内存地址,交换位置。然后重写数据。