Objectif du paramètre Django 'SECRET_KEY'


157

Quel est exactement l'intérêt du SECRET_KEYdans 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 une explication plus approfondie à ce sujet, et pourquoi il est nécessaire.

Par exemple, que pourrait-il se passer si la clé était compromise / d'autres savaient ce que c'était? Je vous remercie.


4
Si vous avez une clé secrète, et qu'elle est compromise et communiquée à d'autres, vous avez un problème. Peu importe que vous utilisiez Django ou non.
Jared Farrish le

35
Mais quel problème, exactement?
tobych

7
J'ai fait une réponse approfondie ici (prise sans vergogne)
sberder

4
@sberder Vous devriez peut-être aussi écrire une réponse à cette question. J'imagine que vous pourriez le faire beaucoup mieux que la non-réponse acceptée.
kasperd

Réponses:


92

Il est utilisé pour faire des hachages. 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()

9
Pourquoi ne l'ont-ils pas appelé alors un sel? ;)
datenwolf

29
C'est une supposition, mais je suppose qu'il est plus facile de dire aux gens «ne partagez pas votre SECRET_KEY», par opposition à «votre SALTest une clé secrète que vous devez garder pour vous».
Roshan Mathews

12
Cette distinction est très importante. En cryptographie, les sels ne sont pas secrets, mais SECRET_KEYdoivent être gardés en sécurité. L'utilisation de la SECRET_KEYs'apparente beaucoup plus à l'utilisation d'une clé dans un hachage signé tel que HMAC (qui, si les performances n'étaient pas une considération, serait probablement utilisée à la place).
Travis Jensen

32
Cela ne me semble pas être une réponse. Tout ce que vous avez fait était une seule commande grep sans expliquer ce que cela faisait. Où est la réponse à «que pourrait-il se passer si la clé était compromise?»?
kasperd le

De plus, comme SECRET_KEY est confidentiel, le préfixe d'un SECRET à la clé garantit que Django cryptera / masquera les valeurs là où c'est nécessaire.
Linus_30

36

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

Cette valeur [le SECRET_KEYparamètre] est la clé de la sécurisation des données signées - il est essentiel que vous les gardiez 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 dans la documentation Django pour le paramètre 'SECRET_KEY' .)

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

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

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

  • Prévention des attaques intersites ou par réexécution en ajoutant (et en attendant) des valeurs uniques pour la demande.

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

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


1
"et unique entre toutes les instances Django." - cela implique-t-il que si je dis que j'ai 3 serveurs Web exécutant la même application Django derrière un équilibreur de charge, je devrais avoir 3 SECRET_KEYparamètres distincts ?
Adam Parkin

2
@AdamParkin, cela semble être un bon début pour une nouvelle question , pour obtenir sa propre réponse.
bignose

2
Excellente suggestion, faite: stackoverflow.com/questions/51657422/…
Adam Parkin

19

Selon la documentation Django sur SECRET_KEY :

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

  • Toutes les sessions si vous utilisez un autre backend de session 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 changez 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 la rotation des clés ne les affectera pas.


5
Informations utiles sur ce qui se passe si le SECRET_KEYest tourné. +1
Hassan Baig
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.