我知道文件被删除后并没有被完全删除。驱动器只是说嘿,这个空间是空闲的,你可以覆盖它。使用 Boot、Nuke 和 Eraser 等程序,你可以用随机字节覆盖这些部分。
此过程与 SSD 有何不同?使用磁盘优化器修剪驱动器会完全删除文件吗?
答案1
SSD 闪存无法以传统方式覆盖现有数据。在 HDD 系统中,操作系统可以请求将新数据写入已存储数据的相同位置,驱动器将直接覆盖旧数据(磁性)。然而,在 SSD 中,必须先擦除目标区域,然后才能将其写入先前保存数据的位置。这是由内部结构决定的。闪存分为块,再细分为页。数据可以直接写入空白页,但只能擦除整个块。因此,如果您想擦除某个块中的部分数据,其余数据将被复制到另一个块,初始块将被擦除或标记为可用/空白。
该过程由 FTL(闪存转换层)处理,当您更改极少量数据时,它必须执行类似这样的操作:读取整个物理块(假设包含 64 页 - 最多可达 256 页),替换您编辑的内容(假设为 4 页)同时保持其余部分完好无损(60 页),在设备上的某个地方擦除一个新块,最后在该块上写入新的 64 页集合。
TRIM 支持使得旧块被视为空,即使它们尚未被擦除,这也提高了耐用性。
所有这些的结果是,从物理上讲,一些数据仍然存在于标记为空的块中,并且理论上可以通过特殊方法恢复。
但这也简化了很多空闲空间的擦除。你可以创建一个自扩展文件来占据所有空间,或者复制任何随机数据,直到空闲空间为 0,此时你之前的所有块实际上都被不可逆转地擦除了。
如果您想彻底擦除驱动器,可以使用任何支持 ATA 安全擦除的工具,该工具会以电子方式使块中的所有数据无效。这些工具是特定于供应商的(Corsair SSD Toolbox、OCZ Toolbox、Intel Solid State Toolbox、Samsung Magician Software)。这些工具基本上将所有可用块设置为“擦除”状态(电子方式),TRIM 使用此状态进行垃圾收集(并在使用前擦除块)。块保持空白,没有关于其初始内容的信息。
因此,干净的对于 SSD,你只需要遵循一个规则:充分利用空间找点事做。如果简单的复制大文件看起来很奇怪,您可以随时创建一个占用所有空间的加密分区,将数据复制到那里,然后擦除它并重新创建它。但占用所有空间的垃圾数据足以进行彻底清理。
答案2
此过程与 SSD 有何不同?使用磁盘优化器修剪驱动器会完全删除文件吗?
我们需要考虑:
- LBA 扇区动态映射到物理地址
- 通常存在未映射到 LBA 的过度配置空间
- TRIM =/= 擦除
- 压缩:数据在保存到 NAND 之前进行压缩
过度配置
以 240 GB 的 SSD 为例,我们可能会认为,如果我们用零填充这 240 GB,我们将用零覆盖每个 LBA 块,因此数据无法恢复。
这是不正确的,我们更有可能处理 256 GB 的 SSD 驱动器,但是缺少的空间是为固件级别的过度配置保留的。
TRIM =/= 擦除
许多人误以为“修剪”就是擦除数据。这是不正确的。TRIM 是一个“命令”,允许操作系统或实用程序向驱动器发送消息:“我不再需要这些 LBA 块,请随意处理它们”。
通常,SSD 固件会取消映射这些 LBA 地址。这意味着,如果您从这些地址读取数据,驱动器实际上不会从这些扇区读取数据,但通常会返回零填充扇区 (RZAT)。如果您向这些扇区写入数据,则可用扇区将映射到这些 BA 地址。
未映射的扇区是页面的一部分。页面是 SSD 可以写入的最小区域,只有在 SSD 固件实际从这些页面中删除数据后,数据才不会被安全删除,并且可以恢复。
存在允许“修剪”驱动器的 Linux 工具,也存在这些工具的 Windows 端口,尽管这些工具允许快速将驱动器归零,但它不能保证数据真正被擦除,即使您只能从驱动器读回零。
数据恢复实验室可能能够使用 PC3000 之类的设备恢复数据。
压缩
在将数据写入 NAND 内存之前,在固件级别压缩数据的想法已经存在一段时间了,现在正在真正实施。我并不是说每个 SSD 都这样做,但在选择安全擦除方法时,您应该考虑这种可能性。
一个实际含义是,如果我们使用所谓的零填充器覆盖现有数据,零往往压缩得很好。因此实际写入驱动器的数据量可能比您预期的要少得多。
又怎样?
从上面我们可以提炼出,我们需要将不可压缩(高熵)数据写入驱动器以覆盖现有数据,并且我们需要写入两倍于 LBA 可寻址空间的数据量,以确保过度配置的空间也被覆盖。
即使我们这样做,如果我们考虑丢弃的块(由于媒体错误而从池中删除),这仍然不能保证所有数据都被覆盖。
或者,我们可以依赖各种规范(ATA、NVMe 等)中指定的内置安全擦除方法。
https://www.usenix.org/system/files/conference/inflow14/inflow14-zuck.pdf- 关于固件级别压缩 https://www.intel.com/content/dam/www/public/us/en/documents/technology-briefs/ssd-520-tech-brief.pdf- 关于固件级别压缩 https://en.wikipedia.org/wiki/Entropy_(information_theory)- 关于“熵” https://blog.elcomsoft.com/2019/01/life-after-trim-using-factory-access-mode-for-imaging-ssd-drives/- TRIM 后恢复数据
答案3
有很多工具可以擦除驱动器,但大多数工具都相当慢。
我发现安全擦除驱动器(SSD 或 HDD)的最快方法是使用 cryptsetup 向其中写入随机数据。
在 Linux 上,您可以像这样轻松完成:
DEVICE=/dev/??? # put your device ID here
cryptsetup create cryptedDEV $DEVICE # use any pass, no need to remember it
DEVSIZE=$(cryptsetup status $DEVICE | grep "size:.*sectors" | awk '{print $2}')
pv -s $DEVSIZE /dev/zero > /dev/manpper/cryptedDEV
cryptsetup remove cryptedDEV