数据库凭据以纯文本形式存储可以吗?

Posted

技术标签:

【中文标题】数据库凭据以纯文本形式存储可以吗?【英文标题】:Is it okay that database credentials are stored in plain text? 【发布时间】:2011-04-02 04:55:37 【问题描述】:

默认情况下,Django 数据库主机/用户/密码以纯文本形式存储在项目 settings.py 文件中。

目前我似乎想不出更好的方法,但这似乎违反了密码存储的最佳做法。当然,如果攻击者可以访问设置文件,那么一切都可能已经丢失。即使文件被加密,到那时攻击者也可能有办法解密它。

这样好吗?

【问题讨论】:

【参考方案1】:

是的,这是任何数据库通信程序的标准程序。真的没有“更好的方法”来做到这一点。

有一些方法可以帮助防止无效主机连接(IP 表、私有 IP 地址),但实际的连接详细信息几乎总是纯文本。

将文件存储在 web 根目录之外会有所帮助,但如果攻击者可以访问文件系统,那就没关系了。

【讨论】:

【参考方案2】:

您是正确的,以纯文本和 settings.py 文件存储密码不是很好的安全性。您可以通过以下方式提高安全性:

正确设置权限(这取决于您的设置)。理想情况下,只有 python 应该能够读取该文件。

将文件存储在 wwwhtdocs 根目录之外。如果此时攻击者仍然可以访问它们,那么无论如何你都完蛋了。

为了增加安全性,您可以使用对称加密(例如:AES)对连接设置进行加密。将密钥存储在其他地方。因此,即使有人设法访问了连接设置,他们仍然需要找到密钥。主要缺点是现在你必须重写连接方法。

【讨论】:

是否有扩展/重写连接方法以处理加密的示例?此外,在 unix 环境中,如果盒子本身已经受到攻击,是否有一个安全的地方可以保存该密钥? 更改文件权限或文件位置似乎无法解决根本问题 - 密码仍然在源代码管理中提交。理想情况下,您会避免这种情况。【参考方案3】:

由 Heroku recommends 编码的 Twelve-Factor App

配置与代码的严格分离。

这对于凭证管理尤为重要,理想情况下,不应将其提交给源代码控制。

django-environ 库提供了一种很好的方法,可以将大多数特定于环境的配置从 settings.py 文件中提取出来,但是您可以通过使用标准 os 库引用最敏感的位来走很长的路,例如'PASSWORD': os.environ['DBPASS']

当然,您可能仍会将一些密码以纯文本的形式存储在某处,但如果该文件未嵌入到您的代码库中,则泄露的可能性要小得多。

【讨论】:

以上是关于数据库凭据以纯文本形式存储可以吗?的主要内容,如果未能解决你的问题,请参考以下文章

比在配置文件中以纯文本形式存储 mysql 密码更好的方法?

当 API 调用需要以纯文本形式发送密码时,将密码存储在数据库中的最佳方法是啥?

如何在 Android 应用程序中安全地存储凭据(密码)?

将密码以纯文本形式存储在 php 变量或 php 常量中是不是可以?

我应该通过 Twitter 上的直接消息向用户提供丢失的凭据吗?

Git http - 安全地记住凭据