0x00 前言
前阵子转手了一台 Mac 电脑,考虑到个人使用痕迹不被泄露,彻底删除硬盘数据是必要的。
但是单纯的格式化硬盘,数据是可以被有心人恶意恢复的,故本文记录了在 Mac 上彻底擦除硬盘的方法。
0x10 关于删除数据
0x11 常识:反复覆写
如今有一点电脑常识的用户都知道,单纯格式化硬盘并不会真正删除数据 ——
有没有发现复制大文件时需要很久,但无论删除多大的文件都是秒删?
这是因为简单的删除操作,只是对文件原本所在的数据区做了删除标记,实际数据仍然存在于硬盘上。
只有重新对原数据区写入操作才有可能擦除原数据痕迹,甚至至少需要反复重写 7 次硬盘,才能彻底清除原来保存的数据。
0x12 MacOS 特性
而对于 MacOS,根据 Apple 官方的建议,需要:
- 登出 iCloud、iMessage 和 App Store 账户
- 前往 通用
->
还原->
抹掉所有内容和设置 - 最后抹掉硬盘驱动器并重新安装 macOS
如果是 Inter 芯片还需要重置 NVRAM
MacOS 几乎不用担心再出售二手后数据会被意外恢复的问题,这主要是因为 MacOS 都使用了称为 数据保护 的文件加密方法:
- 在首次安装 MacOS 后,会新生成一个宗卷密钥
- 密钥不对外暴露、只存放在专门的安全隔区中,接着利用这个密钥去加密全盘所有的数据
- 之后每次抹掉设备时,宗卷密钥都会改变。这样即使能恢复你的数据,第三方也无从解密
简而言之,官方不保证数据不能被恢复,仅仅保证:即使被恢复数据也很难解密。
0x20 彻底删除数据
但是我不希望数据可以被恢复,即使已经加密过的,也有可能被解密。
所以我还是采用最保险的方案:
- 多次覆写硬盘:确保数据无法被恢复
- 最后再使用官方提供的抹掉数据方法:确保数据无法被解密
0x30 多次覆写硬盘
0x31 复制大文件覆写
起初我使用了我自认为最快的方法: 一生二、二生四、四生八、八生万物,无限复制大文件。
但是很快,复制的过程中我就发现了问题:
- 复制上百个大文件都是瞬间完成
- 使用
df -h
查看复制前后,硬盘使用大小没有发生任何变化。
0x32 APFS 机制
我调研了一下,发现 MacOS 使用了 APFS(Apple File System)机制,它有两个主要特性:
- 克隆索引:当在同一 APFS 卷内复制文件时,系统可能不会实际复制所有数据块,而是创建一个新的文件引用原始文件的数据块。这意味着复制操作看似完成,但实际并未占用额外空间。
- 写时复制(Copy-on-Write, CoW):APFS 在写入数据时,会先将数据写入新的位置,然后更新文件的元数据指向新数据。这确保了数据的完整性,但也意味着数据覆写操作可能不会像预期那样立即生效。
尤其是第 1 个特性,直接导致我复制再多次都仅仅是在复制快捷方式。
0x33 随机噪音生成大文件
解决方案可以使用 dd
命令创建大文件:
dd if=/dev/urandom of=/tmp/largefile.dat bs=1M count=1024
解读如下:
if
: 输入数据源为/dev/urandom
伪随机数生成器,它负责提供伪随机数据流。of
: 期望生成的大文件位置bs
: 设置块大小为 1M 字节count
: 生成 10240 个块,即约生成 1G 的文件
通过调整 count
的大小即可使用任意随机噪音填充硬盘空间。
伪随机数生成器
在 Unix 中的两种 伪随机数生成器:
/dev/random
:在熵池中没有足够熵时会阻塞等待,提供高度随机的数据。/dev/urandom
(“不阻塞随机数”):即使熵池耗尽也不会阻塞,会继续使用内部算法生成伪随机数据。这样保证了不会因等待熵而造成程序停顿,适用于大多数需要随机数据的场景。
工作原理:与 /dev/random
类似,/dev/urandom
不是一个普通文件,而是一个“设备”接口,它利用内核内部的随机数生成器(通常基于熵池)生成数据。这些数据虽然是伪随机的,但在大多数应用场景下足够随机和安全。它从系统收集的熵中生成随机数。
效果如下:
0x40 删除宗卷解密密钥
使用命令填充并删除大文件 7 次以上后,再使用 Apple 官方提供的方法 抹掉所有内容和设置 并重新安装 macOS,即可把卷宗解密密钥也一并删除,这样任何人都不可能恢复并解密数据了: