web-dev-qa-db-fra.com

But de Django paramètre 'SECRET_KEY'

Quel est exactement le point de la SECRET_KEY au Django? J'ai fait quelques recherches sur Google et vérifié la documentation ( https://docs.djangoproject.com/en/dev/ref/settings/#secret-key ), mais je cherchais un autre explication détaillée de cela, et pourquoi il est nécessaire.

Par exemple, que pourrait-il arriver si la clé était compromise/si les autres savaient ce que c'était? Merci.

125
David542

Il est utilisé pour faire des hashes. Regardez:

>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()
76
Roshan Mathews

La documentation Django pour la signature cryptographique couvre les utilisations du paramètre ‘SECRET_KEY’:

Cette valeur [the SECRET_KEY setting] est la clé de la sécurisation des données signées. Il est essentiel de le garder en sécurité, sinon les attaquants pourraient l’utiliser pour générer leurs propres valeurs signées.

(Cette section est également référencée depuis la documentation Django pour le paramètre ‘SECRET_KEY’) .)

L'API de signature cryptographique dans Django est disponible dans n'importe quelle application pour les signatures cryptographiquement sécurisées sur des valeurs. Django l'utilise elle-même dans diverses fonctionnalités de niveau supérieur:

  • Signature de données sérialisées (documents JSON, par exemple).

  • Jetons uniques pour une session utilisateur, demande de réinitialisation de mot de passe, messages, etc.

  • Prévention des attaques entre sites ou relecture en ajoutant (puis en espérant) des valeurs uniques pour la demande.

  • Générer un sel unique pour les fonctions de hachage.

La réponse générale est donc la suivante: il y a beaucoup de choses dans une Django qui nécessitent une signature cryptographique, et le paramètre 'SECRET_KEY' est la clé utilisée pour celles-ci. Elle doit avoir une base cryptographique solide. quantité d'entropie (difficile à deviner pour les ordinateurs) et unique entre toutes les instances Django.

26
bignose

Selon le Django Documentation sur SECRET_KEY :

La clé secrète est utilisée pour:

  • Toutes les sessions si vous utilisez un autre serveur que Django.contrib.sessions.backends.cache, ou utilisez la valeur par défaut get_session_auth_hash().
  • Tous les messages si vous utilisez CookieStorage ou FallbackStorage.
  • Tous les jetons PasswordResetView.
  • Toute utilisation de la signature cryptographique, sauf si une clé différente est fournie.

Si vous faites pivoter votre clé secrète, tout ce qui précède sera invalidé. Les clés secrètes ne sont pas utilisées pour les mots de passe des utilisateurs et leur rotation ne les affectera pas.

11
Michael B