Django:保护/加密存储的文件

时间:2011-08-11 05:24:15

标签: django security encryption file-storage

在Django项目中,我希望在服务器上保持用户上传的文件安全。这应该在操作系统级别(我们使用的是ubuntu)还是在应用程序级别完成?

在应用程序级别进行加密将更容易维护。但是,除了可能对性能产生负面影响的一些缺点外,我甚至不确定这是否有任何意义。如果黑客破坏了服务器,他还可以访问加密密钥以及如何加密/解密。

非常感谢任何建议。感谢。

2 个答案:

答案 0 :(得分:3)

如何保护数据取决于您要防范的攻击类型。当然,您可能不知道攻击者最有可能如何危害您的系统,除非您特别想要保护某些威胁模型,例如流氓系统管理员。

攻击者可能会访问运行Web服务器的操作系统。在这种情况下,文件系统级加密可能对您没有好处。事实上,文件系统级加密可能只是对物理服务器(这是一个完全有效的威胁模型)的人有用的保护。但是,如果使用存储在数据库中的密钥对文件进行加密,则可以阻止访问Web服务器操作系统但不访问数据库的攻击者。

相比之下,攻击者可能通过应用程序中的漏洞访问数据库而不是操作系统。由于现代操作系统提供了大量且经过充分研究的攻击面,我预计这种可能性会降低。

要保护用户的数据免受完全访问服务器的攻击者的攻击非常困难。您需要使用服务器没有的密钥加密数据。这可能类似于密码或存储在用户cookie中的密钥。所有这些方案的问题在于,不能信任用户坚持这样的关键数据 - 他们总是想要一种方法来重置密码,如果他们忘记了。在大多数情况下,保护数据免受可以完全访问您的操作系统和数据库的攻击者是不现实的。

所以我会选择你想要保护的东西。就个人而言,我希望最有可能实现操作系统渗透,因此使用密钥加密文件,这些密钥隐藏在数据库的一部分中,以某种方式受到额外保护。这里的挑战是操作系统必须存储数据库登录凭据(在settings.py中)才能使Web应用程序正常运行。因此,请尝试在操作系统中尽可能限制这些文件,即尽可能少用户的帐户chmod 600

答案 1 :(得分:1)

你是对的,如果用于加密文件的密钥存储在服务器上,你就不会通过加密文件获得大量增加的安全性。

但是,如果您使用用户提供的密钥,那么您确实获得了一些安全性。例如,如果将加密密钥存储在cookie中,则它仅在每个请求的持续时间内可用。我不认为这会产生任何新的安全问题(如果攻击者可以窃取cookie,他们也可以窃取用户的会话),这将使攻击者更难以访问文件属于当前不在线的用户。

如果你真的是偏执狂,你可以做1Password所做的事情,并将加密数据发送回浏览器,浏览器可以使用JavaScript加密程序对其进行解密......