在delphi7中安全删除文件

时间:2009-01-16 17:28:31

标签: security delphi file-io

我完成它后我需要安全地删除我的输入文件,此时我正在用零覆盖所有数据,这很麻烦,因为我的临时文件夹里装满了旧文件,文件的名称也是安全问题。

我不希望将它们移动到回收站,而是希望它们跳过它并消失,这与字节擦除相关,因为数据恢复软件可以从回收站之外恢复项目。由于名称也很重要,我需要在删除它们之前重命名它们。

5 个答案:

答案 0 :(得分:9)

这是一个渐进的问题。一个应用程序的“安全”对另一个应用程序来说是不安全的。如果安全性 非常重要 ,并且您发现自己在Stack Overflow上提出了这类问题,那么很可能需要与外部安全顾问签订合同。真正重要的例子包括财务信息,医疗记录,或者有法律或合同要求保护数据的任何其他内容。我并不是说这是意味着或暗示你无法解决问题,而是指出这是一个相当复杂和不断发展的问题。

基本上要完成你想要完成的任务:

  1. 一旦您编写的代码完成,然后将文件大小更改为空 - 这会使恢复更加困难,因为原始文件大小已丢失。
  2. 然后将文件( RenameFile )重命名为其他名称。
  3. 最后使用 DeleteFile 删除文件,该文件不会将文件移动到回收站。
  4. 确保您在文件整个磁盘上都保留了独占句柄,或者只能在删除它们之前复制它们。

    正如我所说,这是一个渐进的问题。这是一个非常基本的解决方案,并且存在许多漏洞。因此,根据所需的安全级别,您可以考虑永远不要将文件写入磁盘,或使用多次传递覆盖。如果安全性非常重要,那么实际上在高温下刻录硬盘盘,然后粉碎它是唯一可以确定的方法。

    修改:您似乎删除了代码示例。

答案 1 :(得分:1)

有一些第三方实用程序可以通过命令执行此类操作 - 我发现PGP Command Line具有此功能,如果您搜索周围可能会找到一个可以从命令行执行此操作的免费应用程序。然后,您可以从应用程序中调用该命令,以便安全地删除该文件。

我会说,如果你坚持编写自己的代码来执行此操作,那么不要使用全0,而是将随机字节写入磁盘。并且不要使用内置的c ++ rand函数,使用更安全的随机数生成器。

正如Jim McKeeth所说,如果出现严重的法律后果,那么这不是你想要做的事情。

答案 2 :(得分:1)

Jim已经很好地描述了在代码中解决问题的问题。这个问题确实是渐进式的,您实施的任何解决方案都只能达到完全的安全性而不会实现。所以要做的一件事就是确切地确定你需要保护文件(窥探家庭成员?同事?企业间谍?极权主义政府?),然后相应地设计你的解决方案并记录其局限性。

我有一种正交的建议。代替 - 或者除了 - 在代码中实现安全擦除,您可以要求用户进行合作。例如,您可以建议(或要求)将输入文件存储在加密卷上。在企业环境中,PGP磁盘可能是首选,因为它是一个可识别的品牌,而家庭用户可以很好地使用免费且经过良好测试的TrueCrupt。这两种产品都支持创建虚拟加密卷以及加密整个分区。即使在编写一行代码之前,这对于保持输入文件的名称和内容安全仍然很有用。

答案 3 :(得分:0)

删除文件可能很敏感......

根据客户的需要,我想指出Data remanence现象。这是在简单覆盖后留下的残留数据。 Data erasure是一种破坏残留数据的方法。

关于如何删除残留数据有一些标准,DoD 5220.22-M主要由“安全文件删除”应用程序引用,但显然是the rules have changed

  

截至2007年6月版的DSS   C& SM,不再覆盖   可接受的消毒   磁介质;只消磁或   物理破坏是可以接受的。

所以我所说的是,尝试制定客户必须遵守的规则。

答案 4 :(得分:0)

注意与闪存存储一起使用的“磨损均衡”算法。为了促进均匀磨损,文件在驱动器上移动,并且它对您的应用程序甚至操作系统都是不可见的。因此,您可以“安全删除”所需的文件,并且只会影响文件的最新副本。但是使用恢复软件可以恢复/发现先前的副本。所以解决这个问题的唯一方法就是加密文件内容。