删掉文件不等于删掉数据,格式化也不等于。不过另一头也有个流传很广的误区:很多人以为必须把整块盘写满、而且最好写好几遍,才算"擦干净"。
这个习惯来自二十多年前的硬盘。放在今天的设备上,它买到的那点"安心感",是用大量时间换来的。
前阵子我写了个硬盘擦除工具 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 | 物理销毁 | 最高敏感度数据 |
和"擦几遍"直接相关的结论有两条:
- 对现代机械硬盘,单次覆写即满足 Clear 级别
- 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 的自动策略就是按这个逻辑定的:
| 硬盘类型 | 接口类型 | 填充率 | 理由 |
|---|---|---|---|
| 机械硬盘(HDD) | SATA | 20% | 速度慢,20% 已能在安全与耗时之间取得平衡 |
| 固态硬盘(SSD) | SATA | 25% | 速度中等,适当提高填充率 |
| 固态硬盘(SSD) | NVMe | 30% | 速度极快,可承受更高填充率 |
| 未知类型 | — | 20% | 保守取值 |
检测逻辑是按硬盘类型和接口两个维度交叉判断的:Linux 下通过 lsblk 等命令读取设备信息并匹配 nvme / sata,Windows 下从磁盘型号与接口信息中判断。判断不出来时统一走 20% 的保守值。
SSD 是例外:磨损均衡让"覆写"名不副实
前面说的"覆写一次就够",前提是写入的位置就是数据原来所在的位置。机械硬盘符合这个前提,SSD 不符合。
原因在磨损均衡(wear leveling):
SSD 的 NAND 闪存单元有擦写寿命上限。为了延长寿命,控制器会把写入分散到不同的物理单元上。当你向逻辑块 100 写数据时,控制器不一定写回原来那个物理单元,而是挑一个擦写次数较少的单元写进去,再更新内部的映射表。
结果就是:对 SSD 做"全盘覆写",并不会真的覆盖每一个 NAND 单元。那些已经被重新映射、不再对应任何逻辑地址的物理单元里,原始数据可能还留着。这类数据有时能通过芯片级(chip-off)手段·读出来。
所以对 SSD,覆盖式擦除是不充分的。 正确做法是用固件级命令:
- SATA 接口的 SSD:
ATA Secure Erase(hdparm --security-erase) - NVMe 接口的 SSD:
NVMe Sanitize - 自加密盘(SED):加密擦除(销毁密钥即可失效全部数据)
这类命令由硬盘固件直接执行,一次调用就能清空全部 NAND 单元 —— 既不漏,也比覆写快得多。
QuickWipe 在 SSD 上的处理
那 QuickWipe 是怎么应对这个问题的?
它专门做了一条 SSD 路径:创建大量小文件把盘占满,触发 SSD 控制器的垃圾回收(GC)机制。
原理是:控制器在空间紧张时会回收那些只含无效数据的物理块。用小文件把盘写满,再让控制器去回收,就能促使它清掉那些"覆写碰不到"的单元。
具体实现上做了两件事:
- 按 NAND 类型适配块大小 —— 工具内置了 SLC(4KB) / MLC(8KB) / TLC(16KB) / QLC(32KB) 四档块大小,按检测到的闪存类型选择,确保写入能完整占用物理块
- 使用随机数据而非全零/全一 —— 避免写入内容被控制器的压缩或去重机制"优化"掉
但要坦白说:这条路径是"尽量逼近",不等同于固件级擦除。如果硬盘要离开你的控制 —— 转卖、送修、报废 —— SSD 上更稳妥的选择仍然是厂商工具或 hdparm 发的 ATA Secure Erase。工具本身也会在相应流程里提示这一点。
QuickWipe 的功能与实现

交代完原理,说一下这个工具本身。
核心特性:
- 按硬件自动选填充率:检测硬盘类型(HDD/SSD)与接口(SATA/NVMe),套用上表策略
- 两种填充模式:
0x00(全零)与0xFF(全一),另外 SSD 路径使用随机数据 - 跨平台:Windows 与 Linux 双平台,两边分别实现了对应的磁盘检测与写入逻辑
- 安全确认机制:操作前双重确认,防止敲错盘符把好盘擦了
- 实时进度显示:显示填充率、实际填充容量、当前进度与速度
关于填充量的计算,逻辑很直白:
填充字节数 = 磁盘容量(字节) × 填充率
也就是说,选择 20% 时并不是"随机撒 20% 的点",而是写入相当于磁盘容量 20% 的数据量。在机械盘上这会覆盖到连续的区域。


怎么用
环境要求: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 分支),按提示选择磁盘编号。
操作前务必确认三件事:
- 目标盘里的数据你确实不要了 —— 这个操作不可撤销
- 选对了盘 —— 别把系统盘当成要处理的那块,工具的双重确认就是为这个准备的
- 盘是被直接占用的 —— 如果盘还在被系统或程序读写,先卸载
小结
回到开头那个问题:为什么全盘填充是浪费时间?
因为在现代硬盘上,它多花的时间换不到任何额外的安全性。单次覆盖就够这一点,NIST SP 800-88 从 Rev.1 起就写明白了,Rev.2 又确认了一次。那些"多擦几遍"的方法,是低密度硬盘时代留下的操作惯性。
唯一需要区别对待的是 SSD —— 不是因为"擦一遍不够",而是因为磨损均衡会让覆写覆盖不全。对它要么用固件级命令,要么像 QuickWipe 这样通过触发垃圾回收去逼近。
工具已经开源在 GitHub 上,Windows 和 Linux 都能跑:
- SSD知识:企业级与消费级的区别?SSD固态硬盘
- TLC与QLC谁是未来SSD固态硬盘
- Windows 远程太折腾,我做了个 OpenSSH 离线一键安装包开源软件

Comments NOTHING