我想以一种文件无法恢复的方式删除敏感文件(使用C ++)。
我在考虑简单地重写文件然后将其删除,是否足够或者我是否必须执行更多操作?
答案 0 :(得分:4)
这是一篇有趣的论文:
http://www.filesystems.org/docs/secdel/secdel.html
它解决了覆盖文件的一些问题。特别是你无法确定新写入的数据是否写入同一位置,并且无法恢复被覆盖的频率极少甚至一次(在现代媒体上)。
答案 1 :(得分:4)
最糟糕的情况是,如果不破坏驱动器,您无法确定是否已完成此操作。您可能正在运行日志文件系统,该文件系统会在您修改文件时保留原始文件,以便在电源故障或其他情况下中断修改时允许进行灾难恢复。这可能意味着修改文件会将其移动到物理驱动器上,而旧位置保持不变。
此外,一些文件系统故意尽可能长时间地保留旧版本以允许它被恢复。例如,考虑Windows上的影子存储副本,当您修改作为系统还原点一部分的文件的一部分的磁盘块时,新数据将被写入新块,旧数据将被保留。
有API可以禁用文件,目录或整个磁盘的影子存储副本(不知道详细信息,可能需要管理员权限)。
另一个问题是文件系统级压缩。如果使用随机数据覆盖文件,则可能会使其压缩性降低,因此即使磁盘仍然是相同的逻辑大小,它也会更大。所以文件系统可能不得不重新定位它。我不知道Windows是否保证继续使用旧块来启动新的更大的文件。如果用零覆盖,则使其更多可压缩,新数据可能无法达到旧数据的末尾。
如果驱动器已经过碎片整理(IIRC Windows现在默认在后台执行此操作),那么您对该文件所做的任何操作都不一定会影响以前位置的数据副本。
shred
和类似工具在这些相当常见的条件下无法正常工作。
拉伸一个点,你可以想象一个自定义文件系统,其中所有更改都被记录,备份以备将来回滚恢复,和尽快复制到异地备份。我不知道任何这样的系统(虽然当然有自动备份程序在文件系统级别上运行,具有相同的基本效果),但是Windows当然没有API说“好的,你可以删除现在进行异地备份“,因为Windows不知道它正在发生。
甚至在你考虑某人有可能检测到磁盘上的数据的特殊套件之前,即使它被新数据覆盖也是如此。意见不同,这种攻击在现代磁盘上实际上是多么合理,这些磁盘非常密集,因此旧值的残差没有太多空间。但实际上,这是学术性的,因为在大多数实际情况下,你甚至不能确保覆盖旧数据而不是卸载驱动器并使用低级工具覆盖每个扇区。
哦,是的,闪存驱动器并不是更好,它们执行逻辑扇区到物理扇区的重新映射,有点像虚拟内存。这样他们就可以应对失败的部门,做到磨损等等。因此,即使在低级别,仅仅因为您覆盖特定编号的扇区并不意味着旧数据将来不会出现在其他编号的扇区中。
答案 2 :(得分:1)
0和1并不是真的0和1。剩余磁性和其他技术(我怀疑你试图保留内容的用户正在使用它们)可以用来在被覆盖后恢复数据。
看一下这个entry,可能就是你要找的东西。
编辑:
备份我的陈述:
恢复已在硬盘上覆盖的数据的一种标准方法 驱动器是捕获和处理从中获得的模拟信号 在该模拟信号被数字化之前,驱动器的读/写头。 这个模拟信号将接近理想的数字信号,但是 差异将揭示重要信息。通过计算 理想的数字信号,然后从实际模拟中减去它 信号,可以放大后剩余的信号 减法并使用它来确定以前写过的内容 在磁盘上。
答案 3 :(得分:0)
你应该使用一些随机生成的字节覆盖它,使用一个像样的随机数生成器或生成垃圾的加密函数。
要确保所有内容都被覆盖,您可以多次覆盖已删除文件的相同内存区域。
答案 4 :(得分:0)
我认为这可能确实有效。
首先删除文件,然后开始创建一个文件,该文件将填满disc中的剩余空间。这将覆盖磁盘中存在的所有数据,然后,如果您删除已创建的文件,则可以肯定地说您的文件无法恢复。
最好不要创建单个大文件,而是创建许多大小相同或要删除的文件少一点的文件。并且重复多次将增加要过载的数据量。
答案 5 :(得分:-1)
最好在覆盖之前先切碎数据。因此,获取内存地址并交换位置。之后再写入数据。