File.Delete 或 File.Encrypt 擦除文件?

File.Delete or File.Encrypt to wipe files?

是否可以使用 File.Delete 或 File.Encrypt 来粉碎文件?还是这两个函数都不会覆盖磁盘上的实际内容? 如果他们这样做了,这是否也适用于 SSD 的磨损均衡和其他存储的类似技术?或者我应该使用其他功能吗?

我正在尝试改进一个开源项目,该项目当前以明文形式将凭据存储在一个文件中。由于它们总是写入该文件的原因(我不知道为什么 Ansible 这样做,但现在我不想触及那部分代码,可能有一些正当理由,为什么会这样,至少现在)然后我就可以删除那个文件了。那么使用 File.Delete 或 File.Encrypt 是否是清除磁盘信息的正确方法?

编辑:如果只能使用本机 API 和 pinvoke,我也同意。我不仅限于 .net,还包括 C#。

Edit2:提供一些上下文:明文凭据由 ansible 内部保存,因为它们作为变量传递给在目标 windows 主机上执行的模块。该文件负责再次检索变量:https://github.com/ansible/ansible/blob/devel/lib/ansible/module_utils/powershell/Ansible.ModuleUtils.Legacy.psm1#L287 https://github.com/ansible/ansible/blob/devel/lib/ansible/module_utils/csharp/Ansible.Basic.cs#L373

有可能 File.Encrypt 比 File.Delete 更有助于粉碎数据(在这方面肯定没有任何作用),但这不是可靠的方法。

操作系统和硬件级别都有很多事情要做,这是几个与 .NET 代码分离的抽象层。例如,您的文件系统可能会随机决定移动它在磁盘上物理存储文件的位置,因此覆盖您当前认为文件所在的位置可能不会真正删除文件先前存储位置的痕迹。即使您成功地覆盖了文件的正确部分,磁盘本身也经常会有残留信号,可以被拥有合适设备的人拾取。一些文件系统不会真正覆盖任何内容:它们只是在每次发生更改时添加信息,因此您始终可以找出磁盘在任何给定时间点的内容。

因此,如果您无法合法地阻止文件被保存,那么任何真正删除它的尝试都将是不完美的。如果您愿意接受不完美并且只想在某种程度上减轻问题的可能性,您可以使用策略 like the ones you've found 尝试用垃圾数据覆盖文件几次并希望最好。

但我不会很快放弃从源头上解决问题。例如,Ansible's docs提到:

A great alternative to the password lookup plugin, if you don’t need to generate random passwords on a per-host basis, would be to use Vault in playbooks. Read the documentation there and consider using it first, it will be more desirable for most applications.