如何安全地删除拇指驱动器的内容以使数据无法恢复。

如何安全地删除拇指驱动器的内容以使数据无法恢复。

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

答案1

TL/DR:确保您获得正确的设备名称,确保它没有安装,并尽可能多地进行随机覆盖。如果您使用的是足够新的发行版,则可以在其后执行专为闪存硬件设计的擦除命令。在这些检查中,始终使用驱动器(例如 /dev/sdH)而不是分区名称( /dev/sdh1

# 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
#

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

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

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

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

但事实并非如此。智能闪存控制器只需将 4KB 新数据写入其他位置,并记录将读取重定向到旧块中间的这 4KB 数据。他们需要更多的空间,但我们无法看到这些空间来存储有关重定向的信息。他们还尝试确保遍历所有可访问的段来存储数据,这称为磨损均衡

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

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

# blkdiscard -s /dev/myusbdevice

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

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

另一种不太安全的方法是,如果可能的话,使用随机值多次覆盖旧数据,以确保较少的旧数据在某个地方徘徊。

你问为什么是随机的?想象一下,如果 USB 驱动器做得太智能,并且检测到您想要清除某个扇区,并且只是在位图中进行了更改,则该扇区现在是空闲的,并且稍后需要清除。因为这意味着它可以加快零的写入速度,所以它使得随身碟可以出现更有效率,对吗?你的驱动器是否这样做,很难说。

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

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

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

# shred -vzn88 /dev/myusbdrive

使用的选项:

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

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

哦,一定要仔细检查您要清除的设备! dmesg 可以帮助查看最近插入的设备是什么,并且值得检查您打算使用 清除的设备名称ls -al,甚至设备节点号,以及输出blkid以查看哪些分区可能是您不可用的想要清除。

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

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

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

TRIM/操作DISCARD比命令要新得多SECURITY ERASE,并且是为了响应闪存功能而创建的,因此即使在廉价的 USB 驱动器中,它也有更高的实现机会,但它仍然不是普遍存在的。如果您想擦除 USB 加密狗中的 SD/micro SD 卡,并blkdiscard报告不支持该卡,您可能需要尝试不同的加密狗/读卡器,和/或在具有直接 SD/MMC 插槽的机器中执行此操作。

答案2

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

答案3

我知道的最简单、最快的方法是将零 (0) 写入整个驱动器:

dd if=/dev/zero of=/dev/sdX

其中/dev/sdX是拇指驱动器的设备节点。

一些人建议采用更多迭代和其他模式的更彻底的过程。可以使用特定的实用程序来执行此操作。 GNU coreutils 软件包包含shred专门用于此目的的命令。许多人还使用badblocks -w,它是 e2fsprogs 软件包的一部分。在 FreeBSD 上,该shred实用程序被调用并且应该在或端口gshred中可用。/usr/ports/sysutils/coreutils/usr/ports/sysutils/fileutils

答案4

如果您打算重复使用您的闪存驱动器,这应该能够安全地擦除它: http://linux.die.net/man/1/scrub 如果没有那就融化吧...

相关内容