django 的 settings.py 中的密钥中的“Django-insecure”

Posted

技术标签:

【中文标题】django 的 settings.py 中的密钥中的“Django-insecure”【英文标题】:"Django-insecure" in secret key in settings.py in django 【发布时间】:2021-07-18 07:00:46 【问题描述】:

使用django-admin startproject 创建一个新项目后,我的settings.py 包含:

SECRET_KEY = 'django-insecure <actual secret key>'

我以前从未在密钥中看到“django-insecure”。这是什么意思?

【问题讨论】:

你应该在那里输入你自己的秘密。 这是 Django 3.2 中的一个新特性,它表明这个密钥是由 Django 自动生成的,因此是不安全的。检查ticket #31757 为什么自动创建的密钥不安全?似乎比人类的关键思想要安全得多…… 那么可以随便输入吗?我认为它必须匹配存储在 django 安装文件中某处的另一个密钥 【参考方案1】:

为什么自动创建的密钥不安全?似乎比人类的关键思想要安全得多。

它是使用众所周知的过程从无法保证质量和安全性的熵源(由 Django)生成的。这是表面上的原因;见https://docs.djangoproject.com/en/3.2/ref/checks/#security

security.W009:你的SECRET_KEY少于50个字符,少于5个唯一字符,或者以'django-insecure-'为前缀表示它是由Django自动生成的。请生成一个长且随机的SECRET_KEY,否则Django的许多安全关键特性将容易受到攻击。

更重要的是,嵌入在设置文件中的任何密钥仅与文件系统的访问控制机制一样安全。 Django 设置文件是查找密钥的明显位置。

将密钥保存在加密安全的密钥库或HSM 中更安全,然后通过环境变量将其密钥传递给 Django;见Where to store secret keys DJANGO。

而且,无论您如何管理它们,您都应该自己使用您控制的硬件和您可以 100% 信任的机制 + 熵源生成您的密钥。 (如果您无法选择,请考虑掷骰子作为随机数字的来源。)

【讨论】:

【参考方案2】:

在 django 3.2 中,最好为生产创建自己的密钥(确保它足够安全)并将其移动到您的环境变量中,并且最好将此不安全的密钥仅用于开发目的。一个安全的 SECRET_KEY 是这样的:

密钥必须是一个很大的随机值,并且必须保密。 确保生产中使用的密钥未在其他任何地方使用,并避免将其提交到源代码控制。这减少了攻击者可以从中获取密钥的向量数量。 与其在设置模块中硬编码密钥,不如考虑从环境变量中加载它:

这是一个例子:

 import os
 SECRET_KEY = os.getenv("SECRET_KEY", "django-insecure <actual secret key>")

【讨论】:

【参考方案3】:

这是一个明显的警告,任何硬编码的密钥从一开始就是不安全的。这个想法是在开发和生产中使用不同的密钥。

您可以使用this one 等在线生成器轻松生成新密钥

在您的服务器上,将您的 SECRET_KEY 添加到环境变量中,并将这些行添加到您的 settings.py 中

import os
SECRET_KEY = os.environ['SECRET_KEY']

我个人不喜欢将密钥保存在文件中,但这也是可能的。

请注意

【讨论】:

以上是关于django 的 settings.py 中的密钥中的“Django-insecure”的主要内容,如果未能解决你的问题,请参考以下文章

Dango本地配置local_settings

模板中的 Django settings.py 变量

我可以从 Django 中的模板访问 settings.py 中的常量吗?

我可以从 Django 中的模板访问 settings.py 中的常量吗?

mange.py中的Django settings.py导入错误配置错误

如何访问 django settings.py 中的模型或视图属性?