我如何安全地清除硬盘?

我计划出售一个USB外置硬盘,其中目前包含一份带有存储密码和银行信息的旧Ubuntu安装。

在出售之前,我应该如何安全地擦除该硬盘?


3此外,您还可以查看EFF页面,其中详细解释了多个操作系统的删除方法。 - Tom Brossman
@Lekensteyn "删除密钥插槽"?我在AU上搜索了一下,除了这个部分相关的问答之外,什么都没有找到。我应该把这个问题作为一个新问题提出来,还是已经在这里有相关内容了? - Tom Brossman
如果你有一个安全的密码短语,当你丢失你的驱动器时,世界并没有完全失去。然而,建议按照http://code.google.com/p/cryptsetup/wiki/FrequentlyAskedQuestions#5._Security_Aspects中5.3节所述清除密钥槽。请继续询问关于擦除加密磁盘的问题。 - Lekensteyn
@TomBrossman 你贴的链接已经失效了,所以我在这里贴上一个存档链接 - AJM
18个回答

安全擦除存储设备

有一款命令行实用程序叫做shred,它可以使用随机位覆盖文件或整个设备中的数据,几乎不可能恢复。

首先,您需要确定设备的名称。

可能会像/dev/sdb/dev/hdb这样(但不是/dev/sdb1,那是一个分区)。您可以使用sudo fdisk -l列出所有连接的存储设备,并在其中找到外部硬盘。

注意:确保选择正确的设备,选择错误的设备将导致其数据被清除。

如果该设备上有任何已挂载的分区,请卸载它们。 然后运行以下命令,将/dev/sdX替换为您设备的名称:

sudo shred -v /dev/sdX

这将使用随机数据三次覆盖设备上的所有块,-v标志用于详细模式,并打印当前进度。

您可以添加选项-nN,仅执行N次以节省大容量设备的时间。这可能需要一些时间,取决于您外部硬盘的大小(我认为我的4GB闪存驱动器需要大约20分钟左右)。

您还可以通过添加选项-z在最后一次迭代后将所有位设置为零,我更喜欢这样做。

sudo shred -v -n1 -z /dev/sdX

在这之后,您将需要重新分区设备。最简单的方法是安装GParted并使用它:
sudo apt-get install gparted
gksu gparted

在右上角的列表中选择您的设备。然后选择“设备 -> 创建分区表”来在设备上创建一个分区表。
然后添加一个使用设备上所有未分配空间的单个分区,选择“fat32”作为文件系统。通过点击工具栏中的“应用”按钮(绿色勾号)来应用更改。
提示:
- 通过在线阅读shred命令的man页或在终端中输入“man shred”来了解更多信息。 - 注意,某些磁盘的部分内容将不会被擦除 - 使用驱动器固件的“SECURE ERASE”命令(例如通过hdparm)来正确清理磁盘。

40最佳做法是:断开所有硬盘,插入外部驱动器,然后使用一个Live CD进行上述操作,以防止任何重要数据的损坏。 - Nick Pascucci
只是一个问题:你写道"shred会用随机数据三次覆盖设备上的所有数据" - 它对空白空间有任何作用吗?顺便说一下,Ubuntu在manpages.ubuntu.com上有自己的手册存储库。 - papukaija
@papukaija 应该可以。 - nanofarad
44请注意,美国证券交易委员会(SEC)已经废除了此答案,现在可以使用“SECURE ERASE”方法来要求驱动器自行擦除数据。这种方法可以处理所有可能的数据,并且不会对您的系统造成不必要的压力。您可以使用hdparm工具执行安全擦除,让驱动器自己擦除数据。该方法试图擦除整个驱动器,包括坏扇区。此外,它比常规覆盖方式更快速。对于固态硬盘驱动器,这也是推荐的方法,而使用“shred”则是极不明智的选择。 - Maarten Bodewes
根据手册:shred - 覆盖文件以隐藏其内容,并可选择删除它。 - Mihai Bujanca
在我的情况下,我只是想要删除一个分区,所以shred /dev/sdc4似乎可以工作。 - AmanicA
9@owlstead:能否详细说明一下?什么是SECURE ERASE,如何使用?如果您有更好的答案,请另写回答。 - Mads Skjern
22关于使用ATA Secure Erase命令的评论是误导性的。使用SE存在严重问题(涉及供应商不一致的支持和过程缺乏透明度)。相关链接:http://security.stackexchange.com/questions/62253/ - MV.
只是一个注意事项,如果您在HP Proliant服务器上使用RAID控制器,那么如果您添加要擦除的硬盘驱动器,那么您必须使用hpacucli创建一个新的逻辑驱动器,然后它才会显示在Linux中。在此之后,上述操作将正常工作。 - Sverre
1@Frxstrem 为什么你说恢复数据 "几乎" 不可能呢?使用 shred 命令不会使数据 绝对 不可恢复吗? - Fiksdal
3@Fiksdal 我不知道,我写下这个回答已经五年了,我不记得当时为什么用那种方式表达。不过,我想我是指的是“在今天几乎不可能,但随着足够的技术改进,未来有可能实现”。 - Frxstrem
1有人愿意写一个关于如何使用hdparm擦除磁盘的完整答案吗? - Tor Klingberg
2如果有人偶然发现这个问题,我在这里找到了hdparm的解决方案:https://grok.lsu.edu/article.aspx?articleid=16716 - jparg
2这里有另一个关于使用hdparam进行安全擦除的好教程:https://code.mendhak.com/securely-wipe-ssd/ - Alexander Gelbukh
@AmanicA shred无法使用于单个分区,请移除4以擦除整个sdc驱动器。 - mekb
我认为在这个问题中,不需要使用gparted,因为它是关于安全擦除,而不是准备后续使用。我认为操作系统安装程序不需要你进行这样的准备。 - H2ONaCl

使用dd工具将其归零:

  1. 通过系统 > 管理 > 磁盘实用程序启动磁盘实用程序
  2. 在左侧面板中找到您的磁盘,选择它,在右侧找到设备路径(例如/dev/sdX
  3. 从终端运行以下命令(应用程序 > 附件 > 终端):

    sudo dd if=/dev/zero of=/dev/sdX bs=1M

    确保您使用正确的设备路径,而不仅仅是复制此行!

这将使用零覆盖整个磁盘,并且比生成千兆字节的随机数据要快得多。与所有其他工具一样,这不会处理由于某种原因(写入错误,保留等)映射出的块,但是您的买家几乎不可能拥有工具和知识来从这些块中恢复任何内容。

PS:在Bruce Schneier的粉丝们对我进行投票之前:我想要证明,即使使用零覆盖,也可以从非古老的旋转硬盘中恢复数据。不要考虑发表其他评论! :P


11+1给布鲁斯·施奈尔(以及DD,它确实是一个优秀的工具) - n3rd
6虽然我不是说这是最有力的“证据”,但古特曼方法存在是有原因的。据我所知,现代硬盘理论上仍然容易被恢复数据,即使已经被零覆盖。无论这个理论是否依然成立,希望你能承认使用/dev/random或者专门为此目的设计的算法进行覆写不会有任何坏处。 - Cerin
17不,这不会有任何伤害,只是会花费很多时间(尤其是如果你使用/dev/random :P),而且效益也值得怀疑。我读过的最后一篇关于这个主题的论文(抱歉,没有详细信息,我想它是2008年的)根据对真实硬件进行测试的数据提出了建议 - 单个位恢复的机会小于50% → 这意味着当使用抛硬币来“恢复”每个位时,错误率更低。所以,除非有证据表明清零不够(现在不是“可能”,而是“绝对不行”),这对我来说是首选方法。 - htorque
2/dev/urandom比/dev/random快,对吗? - Tom
1实际上,快了很多(这就是我用“:P”笑脸的原因😉)。如果你不生成足够的“随机性”,/dev/random 甚至会阻塞读取(有关更多信息,请参阅“man urandom”)。 - htorque
15@Cerin 我的理解是,从来没有任何证据表明这些偏执的数据恢复幻想是可能的。正如你在链接的文章的“批评”部分所指出的那样,Guttman本人对他的算法被使用“更像是一种驱逐邪灵的巫术咒语,而不是对驱动器编码技术进行技术分析的结果”持批评态度。除了情感上的原因外,即让你感觉更好,没有其他技术上的理由来进行多次擦除驱动器的操作。 - irrational John
1根据在https://digital-forensics.sans.org/blog/2009/01/15/overwriting-hard-drive-data/找到的研究论文显示,只需进行一次完整的零填充即可。 - Jesuisme
6好的,不过您能否请友好地解释一下您为什么使用了 bs=1M 参数?我可以阅读手册,而且我理解您只是将缓冲区限制在1兆字节;为什么这样做是有益的呢? - gaazkam
3虽然我不是专家,但我听说在当前的内核下(并且没有必要了解如何正确设置所有dd魔法),通常只需要执行cat </dev/zero >/dev/sdX就足够了。 - Alois Mahdal
@AloisMahdal测试了你的说法,是的,我的笔记本电脑/固态硬盘没有任何区别。 - ndemou
1@gaazkam 默认大小为512字节。每个写操作都需要时间来完成,因此增加每次写入的数据量应该会增加吞吐量。当使用dd ... status=progress或者类似的工具iotop时,我也能看到这一点。从理论上讲,硬件支持的最大负载写入大小可能会导致最少的写入操作次数。 - user8675309
请注意,DD不支持大于2TB的硬盘驱动器 - 如果您使用的是现代硬盘,它会“显示”已擦除,但实际上并没有完全擦除最后一部分。 - cnd
@user8675309 - 你能解释一下“你的硬件支持的最大有效载荷写入大小可能会导致最少的写操作次数”吗? - Motivated
1@cnd - 你能提供一个权威的来源,说明对于大于2TB的驱动器缺乏支持吗? - Motivated
1有时候我不使用/dev/zero是有原因的:像BTRFS或ZFS这样具有透明压缩功能的文件系统会将许多0进行压缩,只有极少数的0会写入磁盘。这在某种程度上有违初衷。 :-) - Thorsten Schöning
@Thorsten:dd/dev/sdX 会绕过驱动器上的任何文件系统。没有 btrfs 或 zfs 在其中压缩数据或重复块。当然,不应指定较高级别的块设备,而应将 sdX 占位符替换为最接近硬件的最低级别块设备描述符。该评论不适用于此回答。 - cfi
你使用较小的bs参数会更安全。例如,在一个80 GB的硬盘上,使用1M的参数得到了76293条记录,总共79999008768字节。而使用64K的参数则得到了1220703条记录,总共79999991808字节。这两次运行所花费的时间大致相同。bs参数默认为512字节,但我没有尝试过。由于结果对bs参数敏感,这个解决方案存在缺陷。@gaazkam - H2ONaCl

我通常使用badblocks -w进行破坏性读写测试。它有两个主要优点:
  • 它是基本系统和几乎所有救援系统的一部分,因此可以从Ubuntu安装程序的救援Shell中使用。
  • 在测试结束时,您会得到一个报告,指示磁盘上是否存在坏块。
请注意,如果报告显示问题,我将不再销售该磁盘,因为它很可能很快就会出现故障。
另外请注意:默认情况下,-w执行4次破坏性写入测试。

使用写入模式测试。使用此选项,badblocks通过在设备的每个块上写入一些模式(0xaa、0x55、0xff、0x00),读取每个块并比较内容来扫描坏块。

用法示例(如果您的磁盘是sdd):
sudo badblocks -wsv /dev/sdd

(为进度条和详细信息添加了sv
要进行更快的擦除,添加-t选项,并执行一次零填充的单次操作,如下所示:
sudo badblocks -wsv -t 0x00 /dev/sdd

看一下安全Stack Exchange上这个明确的问题 如何可靠地擦除硬盘上的所有信息 这讨论了各种安全删除选项,包括物理销毁和擦除,让您可以决定哪个选项可能是最好的选择。
但请记住,不同存储设备的当前恢复状态如下:
- 非常旧的硬盘:在轨道之间存在间隙,因此您有可能捕捉到这些间隙中的泄漏(如果您有扫描电子显微镜)。多次覆盖可能有用。 - 新的硬盘:目前不存在任何技术可以读取一次覆盖后的数据。 - 固态硬盘:由于磨损平衡机制,您无法进行安全的覆写。相反,您要么加密整个卷并销毁密钥以进行擦除,要么销毁设备。

非常古老的定义是什么,例如30年前? - Motivated
大约20-25年前的10Mb MFM硬盘驱动器,是的。 - Rory Alsop
这与移动电话和平板电脑等设备中的驱动有什么关系? - Motivated
鉴于手机和平板电脑使用闪存,答案可能与固态硬盘(SSD)相同,但我不确定。你可以在Super User上询问以获取更好的信息。 - wjandrea
既然你提到了SSD(除了HDD),你所链接的答案是关于SSD的一个特定问题,它指出为了保证安全性,在信息进入SSD之前就要进行加密。事后对驱动器进行加密并不能保护已经存在的信息。换句话说,事后加密并不等同于擦除。 - H2ONaCl
那篇帖子还说,像英特尔320系列这样的一些SSD驱动器已经支持加密。也许Ubuntu知道它不需要以相同的方式处理每个SSD。但是在信息存储到SSD之前,我们仍然应该通过Ubuntu“要求”加密。 - H2ONaCl
@H2ONaCl - 你不需要事后加密来擦除!你应该对整个存储卷进行加密,这样当你丢弃密钥时,驱动器上的所有内容都将永久无法读取。 - Rory Alsop

最好使用ATA驱动器的安全擦除功能。安全擦除是在固件级别上擦除驱动器。安全性更高。
首先检查是否支持安全擦除:
sudo hdparm -I /dev/sdX | grep -i security

(用sda/sdb/sdc替换sdX,根据您的磁盘)。

如果您看不到输出,请使用dd:

sudo dd if=/dev/zero of=/dev/sdX bs=1M

如果你看到输出,请检查设备是否没有冻结。
sudo hdparm -I /dev/sdX | grep -i frozen

如果它被冻结了,看看如何在Linux中解冻驱动器? 否则,如果你看到未冻结,将密码设置为“Eins”:
sudo hdparm --user-master u --security-set-pass Eins /dev/sdX

可选:您可能想知道需要多长时间:

sudo hdparm -I /dev/sdX | awk '/for SECURITY ERASE UNIT/'

然后执行擦除操作:
sudo hdparm --user-master u --security-erase Eins /dev/sdX

然后等待。对于一个1TB的磁盘,这可能需要3个小时或更长时间。

有一个不错的脚本可以自动化这些步骤


根据Wikipedia - Gutmann method的内容,然而,2011年的一项研究发现,8家制造商中有4家没有正确实施ATA安全擦除。 - goulashsoup
1为什么不使用--security-erase-enhanced呢? - goulashsoup

现在,Disksgnome-disks)工具已经添加了ATA Secure Erase功能。您可以使用它来擦除硬盘。同样的选项也可以通过命令行工具hdparm来实现,详细说明请参考this answer

警告!

请查看免责声明和警告说明https://ata.wiki.kernel.org/index.php/ATA_Secure_Erase(感谢@colan提出此问题)

还请参考下方的评论。某些硬件可能会损坏。


打开磁盘工具 → 选择目标磁盘 从菜单中:格式化磁盘... 从下拉框中选择:擦除:ATA增强安全擦除(如果为所选驱动器提供)。或者您可以选择写零(慢速),这被认为是相对安全的。 格式化

ATA Enhanced Secure Erase 1

ATA Enhanced Secure Erase 2


3虽然这通常是最佳选择,但它不适用于USB(如上述问题所问)。关于此事在https://ata.wiki.kernel.org/index.php/ATA_Secure_Erase有警告和免责声明。尽管如此,我还是在[Gnome问题](https://gitlab.gnome.org/GNOME/gnome-disk-utility/issues/87)中询问了相关内容。 - colan
1@colan 我了解这取决于整个技术堆栈的功能支持(磁盘-内核-驱动程序-控制器-驱动器)。虽然我的情况对于两个硬盘是可以的(WD USB3 硬盘和带有 SATA-USB3 主动适配器的 WD 硬盘),但我确认并非所有情况都适用。我见过一些 SATA-USB3 适配器具有硬编码的块对齐方式(以 512 字节和 4K 块读取不会创建相同的镜像),有些不支持 SMART,SMART 有一些较长的执行命令。一些 USB 驱动器具有非标准/扭曲的实现方式,用于密码保护/加密分区(通过另一个 USB 适配器使用会导致损坏)。 - user.dz
@colan 如果USB接口在ATA安全擦除过程中认为驱动器已经休眠,那么同一菜单上的写零替代选项是有用的。写零操作可以让USB接口保持活跃状态。 - H2ONaCl
同样的菜单提供了ATA安全擦除(如果可用的话),还提供写入零(较慢)或标记删除(快速但不安全)的选项。将零化操作合理地视为安全操作,因此建议通用选择该选项。作为图形用户界面解决方案,可以合理地认为它优于命令行的“shred”解决方案。备受赞誉的“dd”解决方案存在缺陷,我发表了一条评论来说明原因。 - H2ONaCl

  • 你需要创建一个回环设备,用/dev/random运行整个驱动器的内容。
  • 那将用几乎完全随机的数据填满整个驱动器。然后你可以用dd将所有位设置回0。
  • 实际上,dd应该能够使所有信息随机化。
  • 你说你在硬盘上存储了银行信息。所以我建议你从Live CD中运行以下命令之一(其中hdX是你的硬盘)。
  • dd if=/dev/zero of=/dev/hdX

    dd if=/dev/random of=/dev/hdX

    dd if=/dev/urandom of=/dev/hdX

  • 不过,根据你的硬盘大小,这将需要很长时间。

供参考:

请参阅以下链接:

注意:

  • Random使用随机位,zero使用0位。
  • Urandom是random的半随机版本。

随机真的有必要吗?将所有位替换为1,然后再替换为0不就足够了吗? - Buck
1永远不要在此类操作中使用/dev/random。/dev/random 使用熵池生成随机数据,并且如果该熵池为空,会阻塞操作。因此,如果您不采取任何措施来生成新的随机性,该操作将永远耗时。请改用/dev/urandom。还可参考"man random"。 - TheRandomGuyNamedJoe12

你可以使用wipe

安装

sudo apt-get install wipe

你可以使用那个软件,或者使用以下命令:
shred -vfz -n ? (drive)

在"?"处,填入您想要删除驱动器的次数,然后在"(drive)"处,填入您想要删除的驱动器。完成后,您可以随意处理它。我认为这种方法更有效,因为您可以控制对驱动器的操作,并立即看到结果。
链接
  1. http://wipe.sourceforge.net/
  2. http://www.howtogeek.com/howto/15037/use-an-ubuntu-live-cd-to-securely-wipe-your-pcs-hard-drive/
  3. http://ubuntuforums.org/showthread.php?t=817882

8为什么要选择其中一种,擦拭还是撕碎? - Mads Skjern

在这种情况下,碎片化相对于dd还有一个优势: 我有一块有问题的磁盘,需要退还给供应商进行更换。
dd在第一个坏块处停止,并且无法覆盖剩余部分(除非我痛苦地使用skip=...来每次跳过停止的位置)。
而碎片化会忽略写入错误,在这种情况下愉快地继续执行。

你可以使用DBANWikipedia
Darik's Boot and Nuke(通常称为DBAN)是一款旨在安全擦除硬盘数据,使其永久删除且无法恢复的软件。它通过使用Mersenne twister或ISAAC(PRNG)生成的随机数覆盖数据来实现这一目标。Gutmann方法、快速擦除、DoD短程(3次擦除)和DOD 5220.22-M(7次擦除)也作为选项包含在内,用于处理数据残留。
DBAN可以从软盘、CD、DVD或USB闪存驱动器引导,并基于Linux系统。它支持PATA(IDE)、SCSI和SATA硬盘。DBAN可以配置为自动擦除系统上检测到的每个硬盘,非常适用于无人值守的数据销毁场景。DBAN适用于Intel x86和PowerPC系统。
与其他数据擦除方法类似,DBAN适用于在计算机回收之前进行个人或商业情况下的数据擦除,例如捐赠或出售计算机。在遭受恶意软件感染的情况下,可以在将硬盘重新投入生产之前使用DBAN。