正如标题所说,这可能吗?
假设我有一个名为 的文件myfile.dat
,rm
无法完成这项工作,如果我无法安装wipe
或shred
其他工具,我可以“自己”安全地删除该文件吗?
答案1
即使使用这样的工具,这种安全擦除方法是否有效也取决于底层文件系统。
如果您使用基于现代写时复制的文件系统,这些工具将根本不起作用,因为它们不会写入文件使用的先前块。
如果您想进行安全擦除,则需要支持文件系统内置的该功能,或者文件系统需要实现一个允许检索文件的磁盘块编号的接口。然而,后一种方法存在安全风险,并且只能由特权用户支持。
答案2
请记住,文件级擦除在实践中的效果在很大程度上取决于底层文件系统和驱动器硬件。现代写时复制(日志式)文件系统(例如 ext4)不会“覆盖”原始位置中的文件数据,这使得大多数面向文件的擦除工具(例如shred
和wipe
)远不如过去那么有用。 SSD 在块级别具有类似的特征,请参阅https://www.howtogeek.com/234683/why-you-cant-securely-delete-a-file-and-what-to-do-instead/
因此,我们必须假设您在老式磁性硬盘驱动器和非日志式非 COW 文件系统上执行此操作。也许这些假设在 90 年代可以接受,但在 2020 年现实吗?
那么,“基本的 Unix/linux 命令行工具”似乎很模糊。 shred
是 coreutils 的一部分,它是一套“基本的 Unix/Linux 命令行工具”。因此,在某种程度上,使用shred
即可满足您的要求!
shred -zu FILENAME
否则,您似乎在寻求一种方法来覆盖现有文件的内容(可能重复),然后“由我自己”删除它。您可以使用dd
将零复制到文件中,但dd
它也是 coreutils 的一部分,因此为什么在实践中这比使用更“由我自己”shred
是值得商榷的。
“我自己”是否意味着仅使用 sh 或 bash 内部命令?
答案3
因为这个问题通常很重要,所以解决方案的扭曲程度可能并不重要。
是的,您可以安全地删除文件,
在原则。
但如果它很重要,这实际上可能是一个实用的解决方案。
当存在可以安全删除文件的工具时,它实际上需要了解文件系统。因此,通常情况下,可以做到这一点的工具实际上不可能存在。
但我们不需要对文件系统做出假设。
我们可以删除整个文件系统!
我们首先使用普通的 rm 命令在文件系统级别删除我们想要完全忘记的文件:
$ rm -f myfile.dat
现在,它不再存在于文件系统中。但我们知道内容仍然存在于文件系统下的存储中 - 因为删除它需要时间。文件系统本身可能仍然拥有有关其位置的信息,甚至很常见。
我们希望有一个不留任何文件痕迹的文件系统。和从文件系统表面看,已经没有任何痕迹了!
现在,我们在其他地方创建一个合适的新的空文件系统。
然后,我们在文件级别复制旧文件系统,它已经是干净的!
我们仍然不太了解文件中的信息可能仍然在哪里,但我们知道它位于旧文件系统下的存储中。我们只是忽略旧文件系统仍然存在,并通过向其写入伪随机字节来清理存储/dev/urandom
。
删除数据就足够了。
如果您仍然不确定它是否已经消失,请不要尝试从 中写入实际的随机数/dev/random
。可以从中读取的随机性并不多,其他软件也需要一些随机性。
只需重复用伪随机数覆盖它,直到/dev/urandom
您放松为止。
然后你可以将新文件系统作为一个整体移动到原始存储位置。完毕。