python - 将 Oauth token 安全地存储在文件中

标签 python security encryption oauth

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

对 token 进行哈希处理是否足够安全?还是我应该加密它们?如果加密它们是可行的方法,您建议如何存储 key ,因为需要 2 种方式加密才能解密发送到 Dropbox 的 token ?

我可以加载 sqlite 并将 token 存储在其中,但我想知道是否有使用平面文件进行此操作的好方法。 Sqlite 也遇到了同样的问题,因为它也一份文件。当然,文件权限只会设置为 web 应用程序访问的最低允许权限。

最佳答案

散列法行不通,因为正如 skjaidev 所提到的,这是一种方式。

如果您有理由担心您的文件或数据库会被盗 (*),加密是您的不二之选。但确实如您所述,您的应用程序需要解密 key ,所以问题是将其存储在哪里。显然将其与数据存储在同一位置并不能提高安全性。请考虑以下事项:

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

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

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

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

关于python - 将 Oauth token 安全地存储在文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7629288/

相关文章:

python - 如何删除 ^M

Python改变函数中的变量和数组?

Java AJAX Web 应用程序安全

java - 如何生成 256 位 AES key

c# - PHP 使用河豚加密字符串

c - memfrob函数的设计与使用

Python:x==y 和 x.__eq__y() 返回不同内容的情况。为什么?

python - 为什么 Python 深受动画行业从业人员的喜爱?

javascript - 在使用 POST 方法发送密码之前,有没有办法用 bcrypt 散列密码?

networking - TCP 时间戳有什么好处?