删掉文件不等于删掉数据,格式化也不等于。不过另一头也有个流传很广的误区:很多人以为必须把整块盘写满、而且最好写好几遍,才算"擦干净"。

这个习惯来自二十多年前的硬盘。放在今天的设备上,它买到的那点"安心感",是用大量时间换来的。

前阵子我写了个硬盘擦除工具 QuickWipe,顺手把相关资料翻了一遍。这篇就把"到底要擦几遍、填多少"这件事讲清楚。

QuickWipe

先说结论

  • 现代硬盘,单次覆盖就足以让数据无法恢复 —— 这是业界权威标准的结论,不是我的推测
  • 那些"擦 7 遍""擦 35 遍"的方法,针对的是 1990 年代的硬盘技术,美国国防部自己现在也不用了
  • 全盘填充的时间成本很容易被低估,尤其在机械盘上
  • 但 SSD 是例外 —— 它的磨损均衡机制会让"覆写"漏掉一部分数据,需要另想办法

"擦 35 遍"是怎么来的

1996 年,Peter Gutmann 发表过一篇论文,提出用 35 种不同的写入模式反复覆盖磁盘,用以对抗"残留磁信号"的恢复技术。同期还有美国国防部的 DoD 5220.22-M 标准,要求写 3 遍或 7 遍。

这些方法在当时是合理的 —— 那个年代的硬盘数据密度很低、磁编码方式也不一样,被覆写过的磁道确实存在理论上的残留分析空间。

问题在于,这个前提在今天已经不存在了。

现在的机械硬盘(2001 年之后的 PMR,以及现在的 SMR)磁道极窄、位密度极高。覆写就是逐字节的物理替换,想从新写入的字节里反推出旧数据,在数学上不可行。

更关键的一点是:"残磁可恢复"这个说法,在现代硬盘上从未被实际演示过。 它一直停留在理论层面,却被当作操作规范流传了二十多年。

权威标准怎么说

这个领域被引用最多的标准是 NIST SP 800-88《媒体消毒指南》(美国国家标准与技术研究院发布)。它定义了三个消毒级别:

级别做法适用场景
Clear覆写等逻辑方法设备在组织内部复用
Purge固件级擦除、加密擦除设备要离开组织控制
Destroy物理销毁最高敏感度数据

和"擦几遍"直接相关的结论有两条:

  1. 对现代机械硬盘,单次覆写即满足 Clear 级别
  2. Rev.1(2014 年)就已经移除了多遍覆写的建议;Rev.2(2025 年 9 月发布)进一步明确:多遍覆写不提供任何额外保障

还有一个细节很能说明问题:美国国防部自己也不再引用 DoD 5220.22-M 了,而是改用 NIST 800-88。一个被广泛引用的"军规标准",早就不被它的发布方使用了。

算一下时间成本

全盘填充的耗时约等于:容量 ÷ 写入速度

按各类硬盘的典型顺序写入速度估算,1TB 盘做一次全盘填写的用时如下:

硬盘类型典型写入速度全盘填充20%–30% 填充
机械硬盘(SATA)约 150 MB/s约 1 小时 50 分约 22 分钟
固态硬盘(SATA)约 500 MB/s约 33 分钟约 8 分钟
固态硬盘(NVMe)约 3000 MB/s约 5.5 分钟约 100 秒

(按典型值估算,实际取决于具体型号、接口协商速率与盘的健康状况。)

在机械盘上,全盘填充要多花一个半小时 —— 而这一个半小时买不到任何额外的安全性。盘越大,这个差距越夸张。

QuickWipe 擦除流程界面:分析磁盘信息后自动选择填充率
工具自动选择填充率的过程

填多少才合适

既然单次覆盖对机械盘就够,那"填多少"其实是一个时间预算问题,而不是安全等级问题。

这里有个反直觉的地方:速度越快的盘,填充率反而越高。因为快速盘即使填得多,总用时依然比慢速盘少。

QuickWipe 的自动策略就是按这个逻辑定的:

硬盘类型接口类型填充率理由
机械硬盘(HDD)SATA20%速度慢,20% 已能在安全与耗时之间取得平衡
固态硬盘(SSD)SATA25%速度中等,适当提高填充率
固态硬盘(SSD)NVMe30%速度极快,可承受更高填充率
未知类型20%保守取值

检测逻辑是按硬盘类型和接口两个维度交叉判断的:Linux 下通过 lsblk 等命令读取设备信息并匹配 nvme / sata,Windows 下从磁盘型号与接口信息中判断。判断不出来时统一走 20% 的保守值。

SSD 是例外:磨损均衡让"覆写"名不副实

前面说的"覆写一次就够",前提是写入的位置就是数据原来所在的位置。机械硬盘符合这个前提,SSD 不符合

原因在磨损均衡(wear leveling)

SSD 的 NAND 闪存单元有擦写寿命上限。为了延长寿命,控制器会把写入分散到不同的物理单元上。当你向逻辑块 100 写数据时,控制器不一定写回原来那个物理单元,而是挑一个擦写次数较少的单元写进去,再更新内部的映射表。

结果就是:对 SSD 做"全盘覆写",并不会真的覆盖每一个 NAND 单元。那些已经被重新映射、不再对应任何逻辑地址的物理单元里,原始数据可能还留着。这类数据有时能通过芯片级(chip-off)手段·读出来。

所以对 SSD,覆盖式擦除是不充分的。 正确做法是用固件级命令:

  • SATA 接口的 SSDATA Secure Erasehdparm --security-erase
  • NVMe 接口的 SSDNVMe Sanitize
  • 自加密盘(SED):加密擦除(销毁密钥即可失效全部数据)

这类命令由硬盘固件直接执行,一次调用就能清空全部 NAND 单元 —— 既不漏,也比覆写快得多

QuickWipe 在 SSD 上的处理

那 QuickWipe 是怎么应对这个问题的?

它专门做了一条 SSD 路径:创建大量小文件把盘占满,触发 SSD 控制器的垃圾回收(GC)机制

原理是:控制器在空间紧张时会回收那些只含无效数据的物理块。用小文件把盘写满,再让控制器去回收,就能促使它清掉那些"覆写碰不到"的单元。

具体实现上做了两件事:

  1. 按 NAND 类型适配块大小 —— 工具内置了 SLC(4KB) / MLC(8KB) / TLC(16KB) / QLC(32KB) 四档块大小,按检测到的闪存类型选择,确保写入能完整占用物理块
  2. 使用随机数据而非全零/全一 —— 避免写入内容被控制器的压缩或去重机制"优化"掉

但要坦白说:这条路径是"尽量逼近",不等同于固件级擦除。如果硬盘要离开你的控制 —— 转卖、送修、报废 —— SSD 上更稳妥的选择仍然是厂商工具或 hdparm 发的 ATA Secure Erase。工具本身也会在相应流程里提示这一点。

QuickWipe 的功能与实现

Image

交代完原理,说一下这个工具本身。

核心特性:

  • 按硬件自动选填充率:检测硬盘类型(HDD/SSD)与接口(SATA/NVMe),套用上表策略
  • 两种填充模式0x00(全零)与 0xFF(全一),另外 SSD 路径使用随机数据
  • 跨平台:Windows 与 Linux 双平台,两边分别实现了对应的磁盘检测与写入逻辑
  • 安全确认机制:操作前双重确认,防止敲错盘符把好盘擦了
  • 实时进度显示:显示填充率、实际填充容量、当前进度与速度

关于填充量的计算,逻辑很直白:

填充字节数 = 磁盘容量(字节) × 填充率

也就是说,选择 20% 时并不是"随机撒 20% 的点",而是写入相当于磁盘容量 20% 的数据量。在机械盘上这会覆盖到连续的区域。

QuickWipe 列出所有磁盘,显示每块盘的型号、容量、接口与类型
QuickWipe 的磁盘列表:型号、容量、接口、类型一目了然
QuickWipe 擦除进行中的终端输出,右侧任务管理器显示磁盘持续写入
擦除进行中:终端显示进度,任务管理器可见磁盘写入活动

怎么用

环境要求:Windows 10/11 或 Linux(Ubuntu / Debian / CentOS 等),需要 Python 3.6 以上,以及管理员(Windows)或 root(Linux)权限 —— 直接写裸设备必须要这个权限。

在 Linux 下(以 V2.0 为例):

sudo python3 QuickWipeV2.0.py

启动后进入交互模式:它会先列出现有磁盘,你选目标盘,工具检测类型并自动给出填充率(也可以手动指定),确认两遍后开始。

在 Windows 下

以管理员身份打开终端,运行 QuickWipeWin.py(或 V2.0 的 Windows 分支),按提示选择磁盘编号。

操作前务必确认三件事

  1. 目标盘里的数据你确实不要了 —— 这个操作不可撤销
  2. 选对了盘 —— 别把系统盘当成要处理的那块,工具的双重确认就是为这个准备的
  3. 盘是被直接占用的 —— 如果盘还在被系统或程序读写,先卸载

小结

回到开头那个问题:为什么全盘填充是浪费时间?

因为在现代硬盘上,它多花的时间换不到任何额外的安全性。单次覆盖就够这一点,NIST SP 800-88 从 Rev.1 起就写明白了,Rev.2 又确认了一次。那些"多擦几遍"的方法,是低密度硬盘时代留下的操作惯性。

唯一需要区别对待的是 SSD —— 不是因为"擦一遍不够",而是因为磨损均衡会让覆写覆盖不全。对它要么用固件级命令,要么像 QuickWipe 这样通过触发垃圾回收去逼近。

工具已经开源在 GitHub 上,Windows 和 Linux 都能跑:

github.com/dellzou/QuickWipe

欢迎来到XiaoZou123,这里是一个电脑极客、数码爱好者网站。我平时喜欢关注数码新闻,研究计算机技术。如果你看我头像觉得我是二次元,那我其实还算不上!
最后更新于 2026-09-16