Django中‘SECRET_KEY’的目的是什么?

264 投票
3 回答
133003 浏览
提问于 2025-04-17 02:04

我在谷歌上搜索了一些内容,也查看了相关文档( https://docs.djangoproject.com/en/dev/ref/settings/#secret-key ),但我想要更详细的解释,想知道为什么这个密钥是必须的。

比如说,如果这个密钥被泄露了,或者别人知道它是什么,会发生什么事情呢?

3 个回答

53

根据Django文档关于SECRET_KEY的说明:

这个秘密钥匙的用途包括:

  • 如果你使用的会话存储方式不是django.contrib.sessions.backends.cache,或者使用的是默认的get_session_auth_hash(),那么它会影响所有的会话。
  • 如果你使用CookieStorageFallbackStorage,那么它会影响所有的消息。
  • 它还会影响所有的密码重置令牌。
  • 任何需要加密签名的地方,除非你提供了其他的钥匙。

如果你更换了这个秘密钥匙,上面提到的所有内容都会失效。不过,秘密钥匙并不用于用户的密码,更换钥匙不会影响用户密码。

88

Django的加密签名文档介绍了‘SECRET_KEY’设置的用途:

这个值[SECRET_KEY设置]是保护签名数据的关键——你必须确保它的安全,否则攻击者可能会利用它生成自己的签名值。

(这一部分也可以在Django关于‘SECRET_KEY’设置的文档中找到。)

Django中的加密签名API可以被任何应用使用,用于对值进行加密安全的签名。Django本身在许多高级功能中也会用到这个:

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

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

  • 通过为请求添加(并期待)唯一值来防止跨站点攻击或重放攻击。

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

所以,总的来说:在Django应用中,有很多地方需要加密签名,而‘SECRET_KEY’设置就是用来做这些的。它需要有足够的随机性(让计算机很难猜到),并且在所有Django实例中要保持唯一。

131

这个是用来生成哈希值的。你看:

>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()

撰写回答