使用find
,可以很容易地递归地粉碎目录的内容(如所讨论的在这个问题中)。然而,有时文件名本身就已经包含敏感信息。有没有办法撕碎一切与某些文件/目录关联,即它在每个周期中都会覆盖文件内容和文件/目录名称?
答案1
shred
大多是无用的。为了从磁盘映像中删除已删除文件的内容,仅覆盖该文件所在的位置是不够的:您需要删除该文件的所有副本。这不仅仅是文件被覆盖的问题。对于许多类型的文件,可能存在多个内容基本相同的文件,因为文件已被编辑并且留下了已删除的备份副本。
另外,如果磁盘损坏,可能无法通过软件方式读取数据,但仍然可以通过硬件方式恢复,或者让磁盘冷却(将硬盘放入冰箱可以减少错误-俯卧一会儿,直到它最终放弃鬼魂)。
粉碎文件的安全方法是从一开始就将其存储在受强密码保护的加密容器中(生成足够长的随机密码,并将其写下来;完成文件后,刻录该文件的片段)纸)。彻底清理你的文件系统(备份数据,然后用零覆盖它),然后创建一个加密文件系统容器并恢复您的文件。一旦确定恢复成功,请不要忘记清理备份,或者将备份存放在安全的地方。
答案2
shred
是 Linux 中的快速随机源,对于一次性覆盖块设备很有用(与/dev/*random
太慢的情况不同),但在覆盖单个文件时不是特别有用。文件系统本身不知道旧副本可能存储在哪里,因此不可能就地覆盖。
我只是用 ext4 尝试过,在创建和删除 3 个文件后,在 1GB 映像中,然后用 Zerofile 填充它,然后在其上提取 Linux 源树...每一步之间都包含同步/重新安装,以及原始文件名字还在那里。
所以我想出了这个命令:
mkdir filenamescrubbing
cd filenamescrubbing
dd if=/dev/zero bs=1M | split -b 4096 -a 254
这会创建大量名称很长的文件(如果您的文件系统允许文件名超过 256 个字符,请为 -a 使用更大的值)。直到空间(使用较小的 -b 值)或 inode 耗尽。
这对我来说摆脱了文件名,因为无论这些文件名存储在哪里,为每个可用的 inode 创建一个新文件名都会清除所有文件名。
当然,这种方法就像用零填充可用空间一样愚蠢。永远无法 100% 保证它确实有效(如果文件数量很大)。
grep -a -b --only-matching yourfilename /dev/yourdevice
假设文件系统简单地存储它们,您可以验证单个文件名。我想sed
如果您想冒损坏设备的风险,也可以直接在设备上进行替换或类似操作。
全盘加密可能是一件好事。