如何在Django中加密存储MySQL密码?

9

我刚开始学习Django项目,在该项目的settings.py文件中,数据库部分如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'blogengine',                 # Or path to database file if using sqlite3.
        # The following settings are not used with sqlite3:
        'USER': 'blogadmin',
        'PASSWORD': 'blog@123',
        'HOST': 'localhost',                 # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
        'PORT': '3306',                      # Set to empty string for default.
    }
}

有没有一种方式,我不需要以明文形式输入密码,而是可以以某种加密形式输入?


https://dev59.com/23A65IYBdhLWcg3w9DqF - Adrián
https://code.djangoproject.com/ticket/16874 - Adrián
2个回答

11

你可以不将密码/令牌存储在settings.py中,这是一种不安全的做法。相反,你应该在运行你的应用程序的用户中创建一个环境变量,比如:

export MYSQL_PASSWORD=1234

并且可以通过以下方式从你的Django应用程序中读取它

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'blogengine',                 # Or path to database file if using sqlite3.
        # The following settings are not used with sqlite3:
        'USER': 'blogadmin',
        'PASSWORD': os.getenv('MYSQL_PASSWORD'),
        'HOST': 'localhost',                 # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
        'PORT': '3306',                      # Set to empty string for default.
    }
}

你应该对所有“敏感数据”进行此操作,例如 EMAIL_HOST_PASSWORD、AWS 令牌和密码等等。这样,你就可以将配置与环境分离,并且不需要在测试服务器或本地环境中更改这些参数,只需确保你的环境变量相同,但指向正确的位置即可。


3
这似乎是个不好的主意。无论那个环境变量被导出到哪里,它仍然存在于某个文件中,因此它仍然以明文形式存储在磁盘上,与只将其保存在设置文件中相比,并没有任何优势——除了现在你必须保护另一个文件。环境变量并不比世界不可读的文件更私密,应用程序用户总是可以使用“cat /proc/(pid)/environ”命令查看其中的值。 - AdamKG
2
这个想法是限制访问,所以只有该用户可以看到变量。我通常遵循 http://12factor.net/,环境变量是我发现的一种方式,可以让多个开发人员在同一个应用程序上工作,并且不必在部署到我的测试服务器或生产服务器时更改很多参数。 - iferminm
2
我们的settings.py已经提交到了git中,因此开发人员可以直接使用它,而只有服务器管理员知道实际服务器的密码。我认为这是正确的做法,应该得到更多的赞同。 - wotanii

10

尝试保护该密码是毫无意义的。

任何可以用于访问数据库的令牌都可以被他人用来访问数据库。这就是共享密钥安全性的工作原理。将密码替换为随机生成的令牌,您仍然需要将该令牌传达给例如settings.py

更好的选择是使用该用户名和密码限制可以连接到MySQL数据库的计算机,增加额外的安全层。另外,通过正确地保护您的Web服务器和源代码控制系统确保没有人能够访问settings.py.


好的,我想我明白了。 - rahuL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接