Django设置'SECRET_KEY'的目的

Dav*_*542 131 python security encryption django

SECRET_KEYdjango 究竟是什么意思?我做了一些谷歌搜索并检查了文档(https://docs.djangoproject.com/en/dev/ref/settings/#secret-key),但我正在寻找更深入的解释,以及为什么需要它.

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

Ros*_*ews 78

它用于制作哈希.看:

>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()
Run Code Online (Sandbox Code Playgroud)

  • 这是一个猜测,但我想更容易告诉人们"不要分享你的`SECRET_KEY`",而不是"你的`SALT`是你应该保留给自己的秘密密钥." (25认同)
  • 这看起来不像是对我的回答.你所做的只是一个grep命令而没有解释它的作用.答案是"如果钥匙被泄露会发生什么?"? (25认同)
  • 这种区别非常重要.在密码学中,盐并不是秘密,但"SECRET_KEY"必须保持安全.使用`SECRET_KEY`更类似于在签名哈希中使用密钥,例如HMAC(如果性能不是考虑因素,则可能会使用它). (11认同)
  • 他们为什么不称它为盐呢?;) (9认同)

big*_*ose 30

用于加密签名Django文档涵盖了'SECRET_KEY'设置的用法:

此值[ SECRET_KEY设置]是保护​​签名数据的关键 - 保持此安全至关重要,否则攻击者可以使用它来生成自己的签名值.

(本节也参考了'SECRET_KEY'设置的Django文档.)

Django中的加密签名API可用于任何应用程序,以便对值进行加密安全签名.Django本身在各种更高级别的功能中使用它:

  • 签署序列化数据(例如JSON文档).

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

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

  • 为哈希函数生成唯一的salt.

因此,一般的答案是:Django应用程序中有许多需要加密签名的东西,而'SECRET_KEY'设置是用于那些的密钥.它需要具有加密强大的熵(计算机难以猜测)并且在所有Django实例之间是唯一的.

  • “并且在所有 Django 实例中都是唯一的。” -- 这是否意味着如果我有 3 个网络服务器在负载均衡器后面运行相同的 Django 应用程序,我应该有 3 个不同的“SECRET_KEY”设置? (3认同)
  • @AdamParkin,这听起来像[一个新问题](/sf/)的良好开端,以获得自己的答案. (2认同)
  • 很好的建议,完成:/sf/ask/3616019571/ (2认同)
  • 这应该是公认的答案。第一个答案是不明确的。 (2认同)

Mic*_*l B 14

根据上的Django文档SECRET_KEY

密钥用于:

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

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

  • 关于如果旋转“ SECRET_KEY”会发生什么的有用信息。+1 (4认同)