Django设置“ SECRET_KEY”的目的


157

SECRET_KEYdjango 的意义到底是什么?我做了一些Google搜索,并检查了文档(https://docs.djangoproject.com/en/dev/ref/settings/#secret-key),但是我正在寻找对此的更深入的说明,以及为什么需要它。

例如,如果密钥被泄露/其他人知道密钥是什么,会发生什么?谢谢。


4
如果您有一个秘密密钥,并且该密钥已被泄露并泄露给他人,那么您会遇到问题。是否使用Django都没关系。
Jared Farrish

35
但是到底是什么问题呢?
tobych 2011年

7
我在这里做了一个完整的回答(无耻的
插话

4
@sberder也许您也应该为这个问题写一个答案。我想您可以做得比接受的非回答好得多。
卡巴斯德(Kasperd)

Answers:


92

它用于制作哈希。看:

>grep -Inr SECRET_KEY *
conf/global_settings.py:255:SECRET_KEY = ''
conf/project_template/settings.py:61:SECRET_KEY = ''
contrib/auth/tokens.py:54:        hash = sha_constructor(settings.SECRET_KEY + unicode(user.id) +
contrib/comments/forms.py:86:        info = (content_type, object_pk, timestamp, settings.SECRET_KEY)
contrib/formtools/utils.py:15:    order, pickles the result with the SECRET_KEY setting, then takes an md5
contrib/formtools/utils.py:32:    data.append(settings.SECRET_KEY)
contrib/messages/storage/cookie.py:112:        SECRET_KEY, modified to make it unique for the present purpose.
contrib/messages/storage/cookie.py:114:        key = 'django.contrib.messages' + settings.SECRET_KEY
contrib/sessions/backends/base.py:89:        pickled_md5 = md5_constructor(pickled + settings.SECRET_KEY).hexdigest()
contrib/sessions/backends/base.py:95:        if md5_constructor(pickled + settings.SECRET_KEY).hexdigest() != tamper_check:
contrib/sessions/backends/base.py:134:        # Use settings.SECRET_KEY as added salt.
contrib/sessions/backends/base.py:143:                       settings.SECRET_KEY)).hexdigest()
contrib/sessions/models.py:16:        pickled_md5 = md5_constructor(pickled + settings.SECRET_KEY).hexdigest()
contrib/sessions/models.py:59:        if md5_constructor(pickled + settings.SECRET_KEY).hexdigest() != tamper_check:
core/management/commands/startproject.py:32:        # Create a random SECRET_KEY hash, and put it in the main settings.
core/management/commands/startproject.py:37:        settings_contents = re.sub(r"(?<=SECRET_KEY = ')'", secret_key + "'", settings_contents)
middleware/csrf.py:38:                % (randrange(0, _MAX_CSRF_KEY), settings.SECRET_KEY)).hexdigest()
middleware/csrf.py:41:    return md5_constructor(settings.SECRET_KEY + session_id).hexdigest()

9
他们为什么不叫它盐呢?;)
datenwolf 2013年

29
这是一个猜测,但我想告诉人们“不要分享您的信息SECRET_KEY” 要容易得多,而不是“您SALT是您应该自己保护的秘密钥匙”。
Roshan Mathews 2013年

12
这种区别非常重要。在密码术中,盐不是秘密的,但SECRET_KEY必须保持安全。的使用SECRET_KEY与HMAC之类的带符号哈希中的密钥的使用非常相似(如果不考虑性能,则可能会使用密钥)。
特拉维斯·詹森2014年

32
这看起来不像是我的答案。您所做的只是一个grep命令,而没有解释任何命令。“如果密钥被泄露会发生什么?”的答案在哪里?
卡巴斯德(Kasperd)

同样,由于SECRET_KEY是机密的,因此在密钥前面加上SECRET可以确保Django在需要的地方加密/屏蔽值。
Linus_18 '18

36

用于加密签名Django文档介绍了“ SECRET_KEY”设置的用法:

此值[ SECRET_KEY设置]是保护​​签名数据的关键-务必确保此安全性,否则攻击者可能会使用它来生成自己的签名值。

对于SECRET_KEY设置,也从Django文档中引用此部分。)

Django中的加密签名API可供任何应用程序用于值的加密安全签名。Django本身在各种高级功能中使用了此功能:

  • 签名序列化数据(例如JSON文档)。

  • 用户会话,密码重置请求,消息等的唯一令牌。

  • 通过添加(然后期望)请求的唯一值来防止跨站点或重放攻击。

  • 为哈希函数生成唯一的盐。

因此,通常的答案是:Django应用程序中有很多东西需要加密签名,而“ SECRET_KEY”设置是用于这些目的的密钥。它需要具有密码学上很强的熵(计算机难以猜测),并且在所有Django实例之间都是唯一的。


1
“并且在所有Django实例之间都是唯一的。” -这是否意味着如果说我有3个网络服务器在负载均衡器后面运行同一个Django应用,我应该有3个不同的SECRET_KEY设置?
亚当·帕金

2
@AdamParkin,听起来像是一个新问题的好开始,以获得自己的答案。
bignose


19

根据上的Django文档SECRET_KEY

密钥用于:

  • 如果您使用的会话后端不是django.contrib.sessions.backends.cache或使用默认会话,则所有会话get_session_auth_hash()
  • 如果使用CookieStorage或,则显示所有消息FallbackStorage
  • 所有PasswordResetView令牌。
  • 加密签名的任何用法,除非提供了不同的密钥。

如果旋转密钥,则以上所有内容都会失效。秘密密钥不用于用户密码,密钥旋转不会影响它们。


5
关于如果SECRET_KEY旋转会发生什么的有用信息。+1
哈桑·拜格
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.