一尘不染

将密码作为环境变量(而不是纯文本)存储在配置文件中是否安全?

django

我在Rails,django(和一点点php)上开发了一些应用程序,在其中一些应用程序中我开始做的一件事是将数据库和其他密码作为环境变量而不是纯文本存储在某些配置文件中(或在settings.py中(对于Django应用)。

在与我的一位合作者讨论此问题时,他建议这是一种不良做法-也许这并不像最初看起来那样安全。

所以,我想知道-这是安全的做法吗?将密码以纯文本格式存储在这些文件中是否更安全(当然,请确保不要将这些文件保留在公共存储库中或其他内容中)?


阅读 1232

收藏
2020-03-28

共2个答案

一尘不染

从理论上讲,我倾向于以以下方式(按照强度递增的顺序)考虑安全级别:

  • 没有安全感。纯文本。任何知道在哪里查看的人都可以访问数据。
  • 通过混淆来保证安全。你将数据(明文)存储在某个位置比较麻烦,例如环境变量,或者存储在看起来像配置文件的文件中。攻击者最终将发现正在发生的事情,或者偶然发现了发生的事情。
  • 加密提供的安全性可以轻易破解(请考虑使用凯撒密码!)。
  • 加密提供的安全性可能会被破坏。
  • 加密提供的安全性对于破坏给定的当前硬件不切实际。
  • 最安全的系统是没人能使用的系统!:)
    环境变量比纯文本文件更安全,因为它们是易失性/一次性的,不保存。例如,如果仅设置一个本地环境变量(例如“ set pwd = whatever”),然后运行脚本,并且脚本末尾退出命令外壳,则该变量将不再存在。你的案件属于前两个案件,我想这是相当不安全的。如果要执行此操作,我建议你不要在直接的Intranet /家庭网络之外进行部署,而仅出于测试目的。
2020-03-28
一尘不染

如前所述,一旦系统受到威胁,这两种方法都不会提供任何额外的“安全性”层。我认为支持环境变量的最重要原因之一是版本控制:我已经看到太多的数据库配置等被意外地存储在像GIT这样的版本控制系统中,其他所有开发人员都可以看到(而且!!)我也是 …)。

如果不将密码存储在文件中,则无法将其存储在版本控制系统中。

2020-03-28