我正在开发一个python中的小型webapp,它将与用户的Dropbox帐户进行交互。在平面文件中存储该帐户的Oauth令牌的最佳方法是什么?
对令牌进行散列是否足够安全?或者我应该加密它们?如果要加密它们,你会建议如何存储密钥,因为解密令牌以便发送到Dropbox需要双向加密?
我可以加载sqlite并将令牌存储在那里,但我想知道是否有一种使用平面文件的好方法。与Sqlite相同的问题,因为它也一份文件。当然,文件权限只能设置为webapp访问的最小权限。
答案 0 :(得分:3)
哈希不会起作用,因为正如skjaidev所提到的那样,它是单向的。
如果您有理由担心您的文件或数据库会被盗(*),那么加密是可行的方法。但实际上,正如您所提到的,您的应用程序将需要解密密钥,因此问题在于存储它的位置。显然,将其存储在与数据相同的位置,不会增强安全性。请考虑以下事项:
最好是将解密密钥放在文件系统上,而不是放在计算机内存中。一个有root访问权限或物理访问权限的好黑客仍然可以使用它,但我认为在99%的黑客可以访问文件系统的情况下,他们也无法读取内存(在他们窃取备份,窃取物理机器(在此过程中将其关闭),获得用户级访问等情况。这基本上是钥匙链方法。问题是,如何将解密密钥放入内存,并且我只知道一种解决方案:每次应用程序启动时输入(或解密解密密钥的其他密码)。这是否可接受取决于您的应用程序重启的频率。
还有另外一种方法。如果您只需要在用户实际登录到您的应用程序时访问Dropbox,您可以考虑使用某些唯一的用户属性加密令牌(或实例用户用来登录您网站的密码,或者一些随机字符串您在第一次访问时设置为cookie)。在这种情况下,您还可以考虑将整个访问令牌存储在cookie中(而不是存储在服务器上)。
无论你选择什么方法,它都永远不会真正保护,就像你自己提到的那样。如果你的应用程序可以获得解密令牌(它可以,否则你的应用程序不需要首先存储它们),一些具有无限特权的黑客也可以。然而,关于访问令牌的好处是它们可能很容易被撤销,所以如果它们被盗,它可能不是世界末日;黑客知道他们很容易被撤销,所以他们很难成为一个目标。
(*)注意:假设东西最终会以这种或那种方式被盗,这是合理的。我可以想象,如果你在家用电脑上为20个朋友设置了一个小网站,那么你关心的是你的密码被盗,而不是你建立下一个Instagram时。它总是在安全性和工作量之间进行权衡。如上所述,将您的令牌放在平面文件而不是数据库中(如果处理正确)应该使它们不太可能被盗。