python - 在 Django 中安全地存储加密凭证

标签 python django security encryption credentials

我正在开发一个 python/django 应用程序,除其他外,它将数据同步到各种其他服务,包括 samba 共享、ssh(scp) 服务器、Google 应用程序等。因此,它需要存储访问这些服务的凭据。我认为,将它们存储为未加密的字段是一个坏主意,因为 SQL 注入(inject)攻击可以检索凭据。所以我需要在存储之前加密凭证 - 有没有可靠的库来实现这一点?

一旦凭证被加密,就需要在使用前解密。我的应用程序有两个用例:

  • 一种是交互式的——在这种情况下,用户将提供密码来解锁凭据。
  • 另一个是自动同步 - 这是由 cron 作业或类似任务启动的。我应该将密码保存在何处以最大程度地降低此处被利用的风险?

  • 或者我应该采取什么不同的方法来解决这个问题?

    最佳答案

    首先在服务器上存储足以登录多个系统的凭据看起来就像一场噩梦。无论加密方式如何,您服务器上的妥协代码都会泄露它们。

    您应该只存储执行任务所需的凭据(即文件同步)。对于服务器,您应该考虑使用同步服务器,如 RSync ,对于谷歌来说,像 OAuth 这样的协议(protocol)等等。这样,如果您的服务器受到威胁,这只会泄漏数据,而不会泄漏对系统的访问。

    接下来是加密这些凭据。对于密码学,我建议您使用 PYCrypto .

    对于您在密码学中使用的所有随机数,通过 Crypto.Random(或其他一些强大的方法)生成它们,以确保它们足够强大。

    您不应使用相同的 key 加密不同的凭据。我推荐的方法是这样的:

  • 您的服务器应该拥有它的主机密 (源自/dev/random)。将它存储在 root 拥有的文件中,并且只有 root 可以读取。
  • 当您的服务器以 root 权限启动时,它会将文件读入内存,并在为客户端提供服务之前放弃它的权限。这是 Web 服务器和其他恶魔的正常做法。
  • 当您要编写新凭证(或更新现有凭证)时,生成一个随机块 小号 .取前半部分并计算哈希 K=H(S1,M) .那将是您的加密 key 。
  • 使用 CBC 模式加密您的数据。拿 初始化向量(IV)来自 S2 .
  • 店铺 小号 与加密数据一起。

  • 需要解密时取出小号 创建 K 并用相同的IV解密。

    对于哈希,我建议使用 SHA1,对于加密 — AES。散列和对称密码足够快,因此使用更大的 key 大小不会受到伤害。

    这个方案在某些地方有点过头了,但这同样不会受到伤害。

    但请再次记住,存储凭据的最佳方法不是存储凭据,当您必须存储时,请使用允许您完成任务的最低权限的凭据。

    关于python - 在 Django 中安全地存储加密凭证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12904560/

    相关文章:

    Python Selenium IE - 单击 anchor 不会更改 URL

    django - 使用 moto 和 boto3 上传测试文件

    python - 如何跟踪我的 Django 应用程序使用的所有组件

    linux - 限制 Linux 应用程序的系统调用访问

    javascript - 如何从 URL 中获取参数

    python - 如果我有 PPP 连接,如何通过 python 脚本识别,如果有,打开 LED?

    python - 为短文本片段建议语义标签

    python - 如何将 feed_dict 和占位符迁移到 TensorFlow 2?

    python - celery 时间表不起作用并使用 Django 得到 KeyError

    asp.net - 尝试登录后 GoDaddy 出现另一个安全异常