安全地删除C#.NET中的文件

安全地删除C#.NET中的文件,c#,winforms,delete-file,C#,Winforms,Delete File,在我正在做的一个项目中,我想让用户选择“安全地”删除一个文件,比如,用随机位或0覆盖它。在C#NET中有没有一种简单的方法来实现这一点?它的效果如何?您无法安全地删除日志文件系统中的文件。唯一仍在大量使用的非日志系统是fat32。在任何其他系统上,安全删除的唯一方法是撕碎整个硬盘驱动器 编辑 安全删除不起作用的原因是,用于覆盖文件的数据可能不会存储在与其覆盖的数据相同的位置 看起来微软确实提供了一个安全的删除工具,但它似乎不是你可以用来替代的工具 除了切碎磁盘之外,防止已删除文件恢复的唯一好方法

在我正在做的一个项目中,我想让用户选择“安全地”删除一个文件,比如,用随机位或0覆盖它。在C#NET中有没有一种简单的方法来实现这一点?它的效果如何?

您无法安全地删除日志文件系统中的文件。唯一仍在大量使用的非日志系统是fat32。在任何其他系统上,安全删除的唯一方法是撕碎整个硬盘驱动器

编辑

安全删除不起作用的原因是,用于覆盖文件的数据可能不会存储在与其覆盖的数据相同的位置

看起来微软确实提供了一个安全的删除工具,但它似乎不是你可以用来替代的工具

除了切碎磁盘之外,防止已删除文件恢复的唯一好方法是在文件写入磁盘之前对其进行加密。

您可以调用以执行此操作。这将使用碎片整理API来处理所有这些棘手的边缘情况

使用碎片整理API,删除 可以精确地确定哪些群集 磁盘上的数据被占用 属于压缩、稀疏和 加密文件


如果您想以一种更方便的形式重新打包该逻辑,下面将介绍API。

我首先尝试打开该文件并像通常那样覆盖其内容。在C#中非常简单,我甚至懒得写它。但我不知道这会有多安全。首先,我很确定它在使用复杂算法提供磨损均衡的闪存驱动器和SSD上不起作用。我不知道那里会有什么效果,也许这需要在司机级别上完成,也许这根本不可能。在普通驱动器上,我只是不知道Windows会做什么。也许它也会保留旧数据。

它根本就不安全。相反,您可能希望寻找加密等替代解决方案。

一种解决方案是加密数据文件的内容。每次更新文件时都会使用一个新密钥。当您想要“安全地删除”数据时,只需“丢失”加密密钥并删除文件即可。该文件仍将实际位于磁盘上,但如果没有加密密钥,则无法恢复

这里更详细地解释了为什么文件的“安全”覆盖安全性较差:

如果没有低级工具(在.net运行时之外),您将无法访问物理磁盘位置。以NTFS上的filestream为例,当您“打开文件进行写访问”时,您不能保证“更新”副本(在本例中为随机101010版本)将存储在同一位置(从而覆盖原始文件)。事实上,大多数情况下都是这样:

1) 文件x.dat从集群8493489开始存储 2) 您可以打开文件x.dat进行写访问。操作系统返回给您的只是一个指向文件流的指针,该文件流不仅由操作系统抽象,而且由底层文件系统和设备驱动程序(例如硬件RAID)抽象,有时还由物理磁盘本身(SSD)抽象。使用随机1&0更新文件内容并关闭filestream

3) 操作系统可能会(也可能会)将新文件写入另一个集群(比如集群4384939)。然后,它将仅更新MFT,指示文件x现在存储在4384939

对于最终用户来说,看起来只有文件的一个副本存在,现在文件中有随机数据,但是原始数据仍然存在于磁盘上


<强>您应该考虑每次保存文件时用不同的密钥加密文件的内容。当用户希望文件被“删除”时,删除密钥和文件。物理文件可能会保留,但如果没有加密密钥,则无法恢复。

您可能的副本完全没有抓住我回答的要点,无法确保您试图写入文件的数据将实际占用与其替换的数据相同的磁盘位置,因此,您无法按要求执行操作。您是要安全地删除内容,还是要用随机位覆盖内容?它们不一样。我认为仅仅覆盖文件并不能达到你想要的效果。@mikerobi-这非常困难(特别是从C#开始),但并非不可能。可能重复[C#-永久删除文件]()谢谢你的回答,我已经稍微重新表述了一个问题。文件是否被完全擦除并不重要,重要的是我使用了与bog标准文件擦除类似的方法program@Andrey,我不明白你的意思如果文件的大小是,比如说,100mb,将所有加密的原始文件保存在RAM中是完全不切实际的…它在任何日志文件系统上都不起作用,不管驱动器类型如何(请参阅我的答案以获得解释)。@mikerobi-我知道,但除此之外,这是次好的选择。至少典型的取消删除实用程序会被愚弄。没有密钥,文件无法恢复,所以它基本上丢失了,对吗?错。密钥的恢复方式与文件的恢复方式相同,除非用户确切知道自己在做什么