2011-10-02 154 views
5

我正在开发一个python中的小webapp,它将与用户dropbox帐户进行交互。在平面文件中存储该帐户的Oauth代币的最佳方式是什么?将Oauth令牌安全地存储在文件中

散列令牌是否足够安全?或者我应该加密他们?如果要加密它们,你会如何建议存储密钥,因为需要双向加密来解密发送到Dropbox的令牌?

我可以加载sqlite并将令牌存储在那里,但我想知道是否有一种很好的方式来使用平面文件。 与Sqlite一样,因为它也是一个文件。当然,文件权限只能设置为Web应用程序访问的最低权限。

+0

散列通常是一种方式。你的平台是否有钥匙环工具? – jman

+0

请注意,SQLite也为数据库使用一个文件,并且从数据库中获取数据是微不足道的。所以它不会为平面文件增加任何安全性。 –

回答

3

哈希不起作用,因为正如skjaidev提到的那样,它是一种方式。

如果您有理由担心文件或数据库会被盗取(*),那么加密是一条可行的路。但事实上,正如你所提到的,你的应用程序将需要解密密钥,所以问题在于它的存储位置。显然将其存储在与数据相同的位置,不会增强安全性。请考虑以下内容:

  • 当您的数据位于数据库中时,它的安全性(很可能)不如平面文件。这是因为有数据库注入技术可能允许您读取数据库,但不能读取文件。在这种情况下,将解密密钥放置在文件系统的某个位置(在您的代码中)是有道理的:来自数据库的数据在这种情况下是无用的。
  • 即使您的数据位于平面文件中,将解密密钥放置在文件的某个位置,也可以降低风险。当黑客访问的系统甚至不应该包含该数据,包含数据的旧备份,或以某种其他方式不(必然)包含解密的代码时,许多系统会被“黑客入侵”键。
  • 最好的办法是让您的解密密钥不在文件系统中,而只在计算机内存中。具有root权限或物理访问权限的好黑客仍然可以使用它,但是我认为,在黑客访问文件系统的情况中,有99%的黑客访问文件系统时,他们也无法读取内存(在它们窃取备份,窃取物理机器(在流程中关闭它),获得用户级访问等)。这基本上是钥匙链方法。问题是,如何将解密密钥存入内存,并且我只知道一个解决方案:每次应用程序启动时输入它(或解密解密密钥的其他密码)。这是否可以接受取决于应用程序重启的频率。

  • 还有一种方法。如果您只需在用户实际登录到应用程序时访问Dropbox,则可以考虑使用一些唯一的用户属性(或实例用户用来登录到您的网站的密码或一些随机字符串在第一次访问时在cookie中设置)。在这种情况下,您还可以考虑存储在Cookie中加密的整个访问令牌(而不是您的服务器)。

无论你选择什么方法,它都不会真正保护,就像你提到你自己一样。如果你的应用程序可以获得解密令牌(它可以,否则你的应用程序不需要将它们存储在第一位),一些具有无限特权的黑客也可以。然而,获取令牌的好处在于,它们可能很容易被撤销,所以如果它们被盗,它可能不是世界的尽头;而黑客知道他们很容易被撤销,所以他们很难成为目标。

(*)注意:假设东西最终会以某种方式被盗取总是合理的。我可以想象,如果您在家用电脑上为20位朋友建立了一个小型网站,那么与您在构建下一个instagram时相比,您不太关心密码被盗。这总是在安全和工作量之间进行权衡。如前所述,将代币放在一个平面文件中而不是数据库(如果处理正确)应该使它不太可能被盗。