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.

David542
la source
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()
Roshan Mathews
la source
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.

gros nez
la source
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.

Michael B
la source
5
Informations utiles sur ce qui se passe si le SECRET_KEYest tourné. +1
Hassan Baig