Python 安全地将Oauth令牌存储在文件中

Python 安全地将Oauth令牌存储在文件中,python,security,encryption,oauth,Python,Security,Encryption,Oauth,我正在用python开发一个小型Web应用程序,它将与用户dropbox帐户交互。在平面文件中存储该帐户的Oauth令牌的最佳方法是什么 散列令牌是否足够安全?或者我应该加密它们?如果加密它们是一种方法,您会建议如何存储密钥,因为需要双向加密来解密令牌以发送到Dropbox 我可以加载sqlite并将令牌存储在那里,但我想知道是否有一种使用平面文件的好方法。Sqlite也会遇到同样的问题,因为它也是一个文件。当然,文件权限只能设置为webapp访问的最低权限。哈希法不起作用,因为正如skjaid

我正在用python开发一个小型Web应用程序,它将与用户dropbox帐户交互。在平面文件中存储该帐户的Oauth令牌的最佳方法是什么

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


我可以加载sqlite并将令牌存储在那里,但我想知道是否有一种使用平面文件的好方法。Sqlite也会遇到同样的问题,因为它也是一个文件。当然,文件权限只能设置为webapp访问的最低权限。

哈希法不起作用,因为正如skjaidev提到的,这是一种方法

如果您有理由担心您的文件或数据库会被盗(*),那么加密就是一条出路。但事实上,正如您所提到的,您的应用程序将需要解密密钥,所以问题是将其存储在何处。显然,将其存储在与数据相同的位置并不能提高安全性。请考虑以下事项:

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

  • 还有一种方法。如果您只需要在用户登录到应用程序时访问Dropbox,您可以考虑用一些唯一的用户属性(或用户登录到您的站点的密码,或者在第一次访问时在cookie中设置的一些随机字符串)加密令牌。在这种情况下,您也可以考虑存储在cookie中加密的整个访问令牌(而不是在服务器上)。
无论你选择什么方法,它都不会真正起到保护作用,正如你所说的那样。如果你的应用程序可以获得解密的令牌(它可以,否则你的应用程序将不需要首先存储它们),一些拥有无限特权的黑客也可以。不过,访问令牌的好处在于,它们可能很容易被撤销,因此,如果它们被偷了,可能还不是世界末日;而且黑客知道它们很容易被撤销,所以作为目标,它们很难引起兴趣


(*)注:人们总是有理由认为东西最终会以某种方式被盗。我可以想象,如果你在家里的PC上为20个朋友建立一个小网站,你会比在创建下一个instagram时更关心你的密码被盗。它总是在安全性和工作量之间进行权衡。如前所述,将令牌保存在平面文件中而不是数据库中(如果处理正确),应该可以减少它们被盗的可能性。

哈希通常是一种方法。您的平台有密钥环功能吗?请注意,SQLite还使用一个文件作为数据库,从中获取数据很简单。所以它不会对平面文件增加任何安全性。