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