C#完全删除文件,使其无法检索

C#完全删除文件,使其无法检索,c#,gnupg,pgp,C#,Gnupg,Pgp,我们有一个软件,可以从客户端检索文件,对其进行解密、处理、加密结果并将其发送回 我们使用PGP密钥(我们的私有密钥用于解密,它们的公共密钥用于加密) 然而,我突然想到,虽然我们在处理完文件后删除了它,但从理论上讲,使用“取消删除”工具从硬盘上获取它是可能的 目前,我们使用gpg2.exe程序作为gpg4win的一部分来对pgp进行解密,因此我不确定是否可以将其直接解密到内存中,这样它就不会接触到硬盘 有没有一种简单的方法可以确保删除时它完全消失?您可以检查gpg程序是否允许从标准输出获取输出,而

我们有一个软件,可以从客户端检索文件,对其进行解密、处理、加密结果并将其发送回

我们使用PGP密钥(我们的私有密钥用于解密,它们的公共密钥用于加密)

然而,我突然想到,虽然我们在处理完文件后删除了它,但从理论上讲,使用“取消删除”工具从硬盘上获取它是可能的

目前,我们使用gpg2.exe程序作为gpg4win的一部分来对pgp进行解密,因此我不确定是否可以将其直接解密到内存中,这样它就不会接触到硬盘


有没有一种简单的方法可以确保删除时它完全消失?

您可以检查gpg程序是否允许从标准输出获取输出,而不是将其写入文件,这样它就不会写入磁盘。可能还有一个C或C++库可以做同样的事情。 如果必须使用中间文件,可以在删除之前用随机数据覆盖内容几次,或者使用专门的碎纸机工具将其删除,从而使其更加困难


旁白:请注意,如果您有足够的妄想症,担心有人使用特殊软件恢复删除的数据,您可能还需要担心RAM中剩余的数据片段。

您可以使用Wipe实用程序()来擦除未加密的数据。

是,取消删除文件和在编写过程中动态捕获文件都很简单。因此,更安全的方法是使用OpenPGP库在内存中执行所有操作(除非您有无法放入内存的大型文件)

您需要记住,内存也会交换到磁盘,因此如果您有绝密数据,您的任务会变得更加复杂-您需要创建不交换的内存块,并以某种方式从.NET使用它们

还有一个更复杂的问题——如果你的应用程序解密了数据,那么它附近就有一个私钥。攻击者很有可能窃取加密密钥,然后窃取加密文件并解密


所以你们的主要问题在磁盘之外——它是在确保整个计算机系统的安全性

stdout可能会工作,一些文件是200mb+的,但是如果这有什么不同呢?我会考虑覆写的东西。这并不是为了任何实际的好处,而是为了满足某些客户要求的有关数据安全的指导原则和要求。我还没有真正测试过从标准输出读取这些数据量,但我认为如果您能够在内存中读取200 MB的文件,这也应该可以。我最近确实使用了ProcessInfo.RedirectStandardOutput(和ProcessInfo.RedirectStandardError!)来处理少量的数据,效果很好。