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


32

我想知道如何通过终端删除USB闪存驱动器,以使数据无法恢复。


31
闪存驱动器?打开东西,将绿色电路板上的所有芯片撬出,然后将它们捣碎成小小的,有光泽的小块,然后再去买。物理破坏确实是唯一可以确保的方法,因为它是所有磨损均衡和材料的组成部分。将来,请使用全盘加密并在不想再使用它时丢失密码。
Blacklight Shining

1
@BlacklightShining-这是唯一的答案。许多便宜的棍子也被回收。
mikeserv '16

1
@BlacklightShining将其转换为等离子也很好。
PyRulez '16

3
如果对您而言重要的是数据不可恢复,则唯一的“安全”解决方案是物理破坏。如果仅难于恢复就足够了,那么除了格式化/覆盖外,真的不需要做更多的事情。
Sobrique'1

用木炭火将其燃烧,确保所有零件都变红。
2016年

Answers:


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
#

从理论上讲,用0进行覆盖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命令,响应Flash功能创建的,所以它具有正在执行,即使是在廉价的USB驱动器的可能性要高得多,但它仍然不是无处不在。如果要擦除USB软件狗中的SD / micro SD卡,并blkdiscard报告不支持它,则可能要尝试使用其他软件狗/读卡器,和/或在具有直接SD / MMC插槽的机器中进行操作。


感谢您提供最新信息。 blkdiscard在Debian Jessie中,并且仅在Ubuntu的最新两个发行版中,而在Ubuntu LTS 14.04中则没有。 blkdiscard已添加到软件包util-linux版本2.23。
罗伯特

您知道如何blkdiscard与@zhenech的另一条评论中hdparm解决方案进行比较(特别是链接:ata.wiki.kernel.org/index.php/ATA_Secure_Erase)。
罗伯特

不知道这是否也与闪存驱动器的情况下,但是这可能是值得一读howtogeek.com/234683/...
hhaslam11

1
@RobertL等于,用不好的方式。大多数便宜的闪存驱动器都没有实现ATA安全擦除或TRIM,因此这两种方法都可能会失败。
duskwuff '16

27

我意识到这并不是您问题的真正答案,但是最简单的方法是物理破坏驱动器(通常用大锤将其砸碎可以解决问题,但是也可以选择工业粉碎或焚化)。如果您对安全性有足够的担忧,希望确保数据不可恢复,则该数据的价值可能是驱动器本身成本的许多倍,并且物理方法便宜且可靠。


5
如果它是便宜的,可更换的闪存驱动器,则肯定会受到物理破坏。如果确实使用锤子,请确保获得了实际的存储芯片。几周前,我打开了一个旧的闪存驱动器进行娱乐,它的大部分物理容量实际上是外壳和空气。
Blacklight Shining

1
除了我的回答,我完全同意-很难通过ssh访问将它们粉碎成碎片:)鉴于这些加密狗对于数据存储的可靠性,很难使它们真正摆脱相同的数据令人惊讶。
chexum'1

同意-如果对您来说重要的是数据不可恢复,那么物理破坏是唯一的选择。让我们面对现实吧,与数据的商业价值相比,即使是最昂贵的驱动器也可能不那么重要。如果不是那么重要,几乎所有擦除/覆盖操作都“足够好”。
Sobrique '16

1
这种方法不仅最有效,而且也最有趣。永远不要放弃使用大锤并获得报酬的机会。
zetetic

2

几乎所有可用的安全删除功能都是为旋转磁介质设计的,计算机通常可以在其中确定用于文件的块的物理位置[1]并覆盖这些相同的块。固态存储控制器芯片从系统中提取数据的物理位置,并且喜欢将其移动。

您的问题实际上取决于谁在处理您的数据。如果您担心随机丢失或临时失窃,则可以使用常规格式。如果您担心拥有大量资源[2]的高动力,技术精湛的用户会成为目标,那么只需将驱动器焚化,然后在新驱动器上花费10美元。

  1. 是的,有逻辑块映射。但是逻辑块A将始终映射到物理块B。

  2. 此人将打开驱动器,从卡中拔出存储芯片并直接读取闪存,而绕过控制器


1

我知道的最简单最快的方法是将零(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端口中可用。


这实际上不足以进行安全擦除。我至少会写20篇有关随机内容的文章。最棒的是,我会使用工具进行安全擦拭,例如切碎。即使有人说这没有任何意义,并且调零就足够了-我不相信这一点。
星期一

4
@monsune那只是一个城市传奇。尽管某些标准要求这样做,但似乎没有任何实际的攻击。
吉尔斯(Gillles)“所以-别再邪恶了”

闪存驱动器使用损耗均衡技术来不会过快地破坏闪存单元。想象一下:驱动器有1200个单元,但仅告诉您它有1000个单元,控制器选择了它实际写入的单元。因此,在dd之后,您已经擦除了1000个单元,但没有擦除200个备用单元,并且可以通过将实际闪存附加到没有备用的控制器上来读取这些单元。我建议在dd之后进行安全擦除,但并非所有闪存介质都支持。
zhenech

@zhenech,什么是“安全擦除”?
罗伯特


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.