Django设置'SECRET_KEY'的目的

时间:2011-09-11 23:59:02

标签: python django security encryption

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

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

3 个答案:

答案 0 :(得分:74)

用于制作哈希。看:

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

答案 1 :(得分:20)

Django documentation for cryptographic signing涵盖了'SECRET_KEY'设置的用法:

  

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

(此部分也引自the Django documentation for the ‘SECRET_KEY’ setting。)

任何应用程序都可以使用Django中的加密签名API来获取值上的加密安全签名。 Django本身在各种更高级别的功能中使用它:

  • Signing serialised data(例如JSON文档)。

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

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

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

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

答案 2 :(得分:7)

According to the Django Documentation on SECRET_KEY

  

密钥用于:

     
      
  • 所有会话,如果您正在使用除 django.contrib.sessions.backends.cache 以外的任何其他会话后端,或者正在使用默认的 get_session_auth_hash()
  •   
  • 如果使用的是 CookieStorage FallbackStorage ,则为所有消息。
  •   
  • 所有PasswordResetView令牌。
  •   
  • 任何使用加密签名的方式,除非提供了不同的密钥。
  •   
     

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