如何确保上传的文件内容在使用后无法恢复?

6
我希望在文件上传到Web服务器后,使其内容不可恢复。我的担忧如下:
  1. 文件上传时,是否存储在临时目录(例如Windows临时目录)中,如何清除所有痕迹?

  2. 文件内容是否可以写入虚拟内存,如何确保不这样做或删除一旦写入的内容?

  3. 如果我加密文件,是否仍然需要担心在加密之前将内容保存到Temp目录、虚拟内存或其他地方?

  4. 我能否在所有相关位置(临时目录、虚拟内存、其他任何地方)执行安全删除,如何操作?

  5. 是否有我忽略的问题或实现所述目标的替代方法?

N.B. 这是一个ASP.NET Web应用程序。

编辑:感谢djeeg指出了一个链接,介绍了如何将临时上传目录重定位到更可控的位置。

对其他点有何反馈?


对于一个明确定义的问题,点个赞。djechelon的回答提到了你应该更加关注的“信任”方面。你必须记住,总会有一个暴露的表面区域,你必须信任某些人。如果你非常担心,你需要一个物理安全的专用服务器和一个紧急开关(一种物理销毁数据的方式),那么你就不必太担心内部机制了。 - Robert
注意:.Net是一种托管运行时,数据的临时存储是实现特定的。因此,任何试图从运行中的系统中清除数据的尝试都将是一个无休止的挑战,因为任何更新都可能改变实际的实现方式。 - Robert
3个回答

3

磁盘安全

您可以使用 wipe 工具来完成此任务。

如果您在 Mono/Linux 上运行 ASP.NET,则可以通过 Process 类使用 wipe 命令(确保已安装 wipe 包)。

如果您在 Windows 上运行,则采用相同的方法。当您需要安全处理文件时,请使用能够执行硬件清理的 wipe.exe 实用程序。

我发现了一个网站,它分发免费的 wipe.exe,这个实用程序不包含在 Windows 标准安装中(太糟糕了)。

第二种方法是实现Guttman 算法,但我认为使用别人的代码更便宜。

请记住,wipe 非常 I/O 密集,不要等待它完成,否则可能会严重拖慢应用程序。另外,在高负载的网站上,您可能会遇到显着的减速。

内存安全

SecureString 类可帮助您在内存中不留下字符串的痕迹。但是,当您处理文件时,实际上是在处理流。我不确定是否需要担心易失性内存的内容(即使您处理 WikiLeaks 文件)。

您必须首先执行威胁分析,告诉您内存的主要威胁是什么。以下是一些问题:

  1. 某人是否可以使用具有执行内存转储能力的管理员/根帐户访问服务器?(普通用户无法读取您的内存,.NET 防止指针未使用而导致缓冲区溢出)
  2. 某人是否可以物理访问服务器?您是否足够信任托管提供商?您是否运行虚拟服务器?

如果答案不是“是”,则无需担心内存安全问题。

交换空间安全

即使您在 Windows 上运行,让我们称“swap”为分页文件或虚拟内存文件等。您可能考虑禁用它(确保您有足够的 RAM),或者您可能考虑对其进行加密(但会导致性能下降)。

但是,为了在运行时扫描您的交换文件,他必须是 root 用户,或者必须可以物理访问关闭的服务器。

如果数据过于敏感,我建议禁用交换。

[添加] 我相信您已经使用 SSL 上传文件,以防万一您忘记了某些原则...


2

0

确保上传的文件已加密。这个应该可以解决问题。您还需要一种安全的密钥交换算法,对于这一点我不太确定,可以尝试在谷歌上搜索。

javascript secure key exchange

确保不要在不同的地方传递解密后的数据。在同一个类或方法中解密和使用数据,并确保在垃圾回收释放对象之前清除数据。保护您的交换空间(我是Linux用户,所以不知道如何在Windows中实现)。

最后,请认识到这是一个难以安全解决的问题,如果预期的回报足够高,任何半吊子或自制的解决方案都很可能在几分钟内被破解。安全性是一种权衡。您的数据价值多少?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接