【发布时间】:2014-12-17 06:57:04
【问题描述】:
假设我有一个 10 MB 的文件并执行以下步骤:
- 用我最喜欢的读/写编程语言打开它
- 擦除流中的所有内容
- 将 10 MB 的随机数据准确写入同一流
- 将更改保存到磁盘
- 通过正常方式删除文件
我能否确定新的 10 MB 在硬盘驱动器的扇区级别上成功覆盖了旧的 10 MB?或者“擦除流中的所有内容”步骤是否有可能删除旧文件并可能将新的 10 MB 写入新位置?
【问题讨论】:
标签: file-io hard-drive
假设我有一个 10 MB 的文件并执行以下步骤:
我能否确定新的 10 MB 在硬盘驱动器的扇区级别上成功覆盖了旧的 10 MB?或者“擦除流中的所有内容”步骤是否有可能删除旧文件并可能将新的 10 MB 写入新位置?
【问题讨论】:
标签: file-io hard-drive
知道自己在做什么并且可以访问磁盘上的原始数据(即不通过文件系统)的专业人员仍然可以访问这些数据。
你的程序基本上相当于Linux的shred命令,包含如下警告:
注意:请注意,shred 依赖于一个非常重要的假设: 文件系统覆盖数据。这是传统 做事的方式,但许多现代文件系统设计不能满足这一点 假设。以下是使用 shred 的文件系统的示例 无效,或不保证在所有文件系统模式下都有效:
日志结构或日志文件系统,例如随 AIX 和 Solaris(以及 JFS、ReiserFS、XFS、Ext3 等)
写入冗余数据的文件系统,即使某些写入也会继续 失败,例如基于 RAID 的文件系统
制作快照的文件系统,例如 Network Appliance 的 NFS 服务器
缓存在临时位置的文件系统,例如 NFS 第 3 版客户端
压缩文件系统
还有其他情况,例如具有磨损均衡的 SSD。
【讨论】:
不,因为在任何现代文件系统上提交都是原子的,所以您几乎可以 100% 确定 10Mb 不会覆盖旧的 10Mb,而那是在我们考虑实际保证这一点的日志文件系统之前。
【讨论】:
简短回答:不。
这可能取决于您的语言和操作系统。我有一种感觉,流调用被传递给操作系统,然后操作系统决定做什么,所以我倾向于你的第二个问题是正确的,只是为了安全起见。此外,在删除后仍会出现磁伪影,该磁伪影仍可用于恢复所述数据。即使用全零覆盖相同的扇区也可能使数据处于褪色状态。通常建议进行多次删除。请参阅here 了解说明,或参阅here 了解开源 C# 文件粉碎机。
对于 Windows,您可以使用 SDelete 命令行实用程序,该实用程序实现了国防部的清除和消毒标准:
安全删除应用程序会覆盖已删除文件的磁盘数据 使用显示使磁盘数据无法恢复的技术,甚至 使用可以读取磁介质中模式的恢复技术 显示弱删除的文件。
特别注意:
压缩、加密和稀疏由 NTFS 在 16 集群中管理 块。如果程序写入此类文件 NTFS 的现有部分 在磁盘上分配新空间来存储新数据,然后 新数据已写入,之前解除分配集群 被文件占用。
【讨论】: