【问题标题】:Securely store Oauth token(s) in file将 Oauth 令牌安全地存储在文件中
【发布时间】:2011-11-29 13:36:17
【问题描述】:

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

对令牌进行哈希处理是否足够安全?或者我应该加密它们?如果加密它们是要走的路,您建议如何存储密钥,因为解密令牌以发送到 Dropbox 需要 2 路加密?

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

【问题讨论】:

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

标签: python security encryption oauth


【解决方案1】:

散列不起作用,因为正如 skjaidev 所提到的,这是一种方法。

如果您有理由担心您的文件或数据库会被盗 (*),那么加密就是您的选择。但确实正如您所提到的,您的应用程序将需要解密密钥,所以问题是在哪里存储它。显然,将其与数据存储在同一位置,并不能增强安全性。请考虑以下几点:

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

  • 还有另一种方法。如果您只需要在用户实际登录您的应用程序时访问保管箱,您可以考虑使用一些唯一的用户属性(或例如用户用于登录您的站点的密码,或您使用的一些随机字符串)加密令牌在第一次访问时设置在 cookie 中)。在这种情况下,您还可以考虑将整个访问令牌加密存储在 cookie 中(根本不在您的服务器上)。

正如您提到自己的那样,无论您选择哪种方法,它都不会真正保护。如果您的应用程序可以获取解密的令牌(它可以,否则您的应用程序首先不需要存储它们),一些具有无限特权的黑客也可以。不过,访问令牌的好处在于,它们可能很容易被撤销,所以如果它们被盗,那可能不是世界末日;黑客知道他们很容易被撤销,所以他们几乎不会成为目标。

(*) 注意:假设东西最终会以某种方式被盗总是合理的。我可以想象,如果您在家用 PC 上为 20 位朋友建立一个小型站点,那么您在构建下一个 Instagram 时更关心密码被盗。它始终是安全性和工作量之间的权衡。如前所述,将令牌放在平面文件而不是数据库中(如果处理正确的话)应该可以降低它们被盗的可能性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-10
    • 2018-09-02
    • 2012-09-11
    • 2010-12-25
    • 2016-07-23
    • 1970-01-01
    • 2019-02-20
    • 2021-05-02
    相关资源
    最近更新 更多