如何安全地删除 U 盘的内容,以便无法恢复数据。

use*_*ser 33 flash-memory data-destruction

如果可能的话,我想知道如何通过终端删除USB闪存驱动器,从而无法恢复数据。

che*_*xum 47

TL/DR:确保您获得正确的设备名称,确保它没有被挂载,并尽可能多地随机覆盖。如果您使用的是足够新的发行版,则可以通过为闪存硬件设计的擦除命令进行操作。在这些检查中,始终使用驱动器(如 /dev/sd h)而不是分区名称(即 /dev/sd h1

# dmesg|grep sdXX
[3600.000001] sd 6:0:0:0: [sdXX] 125106176 512-byte logical blocks: (64.0 GB/59.6 GiB)
# blkid|grep sdXX
/dev/sdXX1: PARTUUID="88a03bb2-ced8-4bb2-9883-0a51b4d460a8"
# df|grep /dev/sdXX
# shred -vzn8 /dev/sdXX
shred: /dev/sdXX: pass 1/9 (random)...
shred: /dev/sdXX: pass 1/9 (random)...46MiB/3.8GiB 1%
...
shred: /dev/sdXX: pass 9/9 (000000)...3.8GiB/3.8GiB 100%
# blkdiscard -s /dev/sdXX
blkdiscard: /dev/sdXX: BLKSECDISCARD ioctl failed: Operation not supported
# blkdiscard /dev/sdXX
blkdiscard: /dev/sdXX: BLKDISCARD ioctl failed: Operation not supported
#
Run Code Online (Sandbox Code Playgroud)

理论上,用零覆盖dd就可以了。但是,由于闪存驱动器的内部构造方式,如果您使用单个覆盖通道,则可能在仍在存储剩余信息的实际块后面隐藏了几层数据。

通常,闪存的一部分有问题,并在制造过程中进行了标记。还有其他一些位可能出错(变得不可更改、不可设置或不可清除),这些部件在生命周期内也必须标记为有故障。此信息存储在保留空间中,与您的数据位于同一芯片上。这是 4GB 拇指驱动器未显示 2^32 字节容量的几个原因之一。

闪存存储也在内部组织成更大的块,有时比驱动器上工作的文件系统大得多。一个典型的文件系统块大小是4KB,一次可以擦除的flash段可能从64KB到几兆不等。这些大块只能整体擦除,这会将所有块重置为已知状态(全 1 或全 0)。之后数据写入可以更改任何位(在需要时将默认 1 更改为 0,或将默认 0 更改为 1),但只能更改一次。要将任何位更改默认值,需要再次擦除所有段!

因此,当您想要更改 4KB 块时(要求文件系统更改文件中间的单个字符),闪存控制器需要读取和缓冲所有 64KB 旧数据,擦除所有数据,然后写回新内容。这会很慢,擦除段是最慢的操作。此外,一个段只能擦除有限的次数(通常为数万次),因此如果对单个文件进行太多更改,则可能会迅速损坏驱动器。

但这不是它的完成方式。智能闪存控制器只需将 4KB 新数据写入别处,并记下将读取重定向到旧块中间的这 4KB 数据。他们需要更多的空间,我们看不到这些空间来存储有关重定向的信息。他们还尝试确保遍历所有可访问的段来存储数据,这称为磨损均衡

这意味着通常旧数据仍在驱动器上的某个地方!如果您只是清除了所有可访问的块,所有隐藏的块仍会保留最新版本的数据。您希望保护您的数据免受攻击的攻击者是否可以访问它,这是一个不同的问题。

如果你有足够新的发行版,并且USB驱动器被编程为显示它是闪存驱动器,则blkdiscard可以使用底层TRIM操作,这就是我们上面谈到的段擦除。它还有一个额外的标志,以确保即使是不可见的隐藏数据也能被硬件完全擦除:

# blkdiscard -s /dev/myusbdevice
Run Code Online (Sandbox Code Playgroud)

-s, --secure 执行安全丢弃。安全丢弃与常规丢弃相同,除了可能由垃圾收集创建的丢弃块的所有副本也必须被擦除。这需要设备的支持。

正如我上面演示的那样,它不一定有效。如果您得到Operation not supported,您的内核、实用程序或 USB 网关芯片(它允许闪存控制器通过 USB 看起来像一个驱动器)不支持传递TRIM命令。(闪存控制器必须仍然能够自行擦除段)。如果您的驱动器供应商支持它,这是最安全的方法。

另一种不太安全的确保您允许较少的旧数据在某处徘徊的方法是,如果可能的话,用随机值覆盖它几次。

你问为什么是随机的?试想一下,如果 USB 驱动器变得过于智能,并且检测到您要清除一个扇区,并且只是在位图中更改了该扇区现在是空闲的,并且稍后需要清除。这意味着它可以加快写入零的速度,因此它使笔式驱动器看起来更高效,对吗?你的驱动器是否在做,很难说。

在最极端的情况下,驱动器只能记住您从一开始就清除了多少,它需要存储的只是大约 4 个字节的信息来执行此操作,并且不会从您想要消失的数据中清除任何内容。一切都是为了让它看起来非常快。

如果你用随机的、不可预测的值覆盖数据,这些优化是不可能的。因此驱动器必须确保数据最终存储在闪存芯片中。但是您仍然无法排除一些以前使用过的扇区仍然存在您的一些旧数据,但是驱动器只是认为擦除它并不重要,因为它无法正常访问。只有实际的TRIM命令才能保证这一点。

要使用随机值自动覆盖,您可能需要考虑使用shred,例如:

# shred -vzn88 /dev/myusbdrive
Run Code Online (Sandbox Code Playgroud)

使用的选项:

  • -v 让它显示进度
  • -z 将其归零作为最后阶段
  • -n8 是进行 8 次随机覆盖

如果可能,请同时使用blkdiscardshred,如果blkdiscard -s您的驱动器支持,这是最佳解决方案,但shred事先排除固件错误也无妨。

哦,请务必仔细检查您要清除的设备!dmesg 可以帮助查看最近插入的设备是什么,还值得检查您打算使用的设备名称ls -al,即使是设备节点号,以及blkid输出以查看哪些分区可能可用但您不知道想清楚。

切勿在要继续使用的内部驱动器上使用这些命令 -blkdiscard仅适用于固态驱动器,但尝试丢失数据是不值得的!

随着技术的进步,可能还有其他方法可以安全地清除数据。

提到的另一种方式是SECURITY ERASE可以通过hdparm命令发出的 ATA命令。根据我的经验,闪存驱动器并不真正支持它。它是为企业硬盘驱动器设计的,该功能并不总是在成本最低的存储设备中实现。

TRIM/DISCARD操作比很多新的SECURITY ERASE命令,响应Flash功能创建的,所以它具有正在执行,即使是在廉价的USB驱动器的可能性要高得多,但它仍然不是无处不在。如果您想擦除 USB 加密狗中的 SD/micro SD 卡,并blkdiscard报告它不受支持,您可能需要尝试不同的加密狗/读卡器,和/或在具有直接 SD/MMC 插槽的机器上执行此操作.


小智 27

我意识到这并不是您问题的真正答案,但最简单的方法是物理销毁驱动器(用大锤反复粉碎它通常可以解决问题,但工业粉碎或焚烧也是一种选择)。如果您非常担心安全性以确保数据不可恢复,那么该数据的价值可能比驱动器本身的成本高出许多倍,而且物理方法既便宜又可靠。

  • 如果它是一个便宜的、可更换的闪存驱动器,那么肯定会进行物理破坏。如果您确实使用锤子,请确保获得实际的存储芯片。几周前我为了好玩打开了一个旧的闪存驱动器,它的大部分物理容量实际上是外壳和空气。 (5认同)