Zweck der Django-Einstellung 'SECRET_KEY'

157

Was genau ist der Sinn des SECRET_KEYDjango? Ich habe ein paar Google-Suchen durchgeführt und die Dokumente überprüft ( https://docs.djangoproject.com/en/dev/ref/settings/#secret-key ), aber ich suchte nach einer ausführlicheren Erklärung dafür. und warum es erforderlich ist.

Was könnte zum Beispiel passieren, wenn der Schlüssel kompromittiert wurde / andere wussten, was er war? Danke dir.

David542
quelle
4
Wenn Sie einen geheimen Schlüssel haben und dieser kompromittiert und an andere weitergegeben wird, haben Sie ein Problem. Es spielt keine Rolle, ob Sie Django verwenden oder nicht.
Jared Farrish
35
Aber welches Problem genau?
Tobych
7
Ich habe eine gründliche Antwort hier (schamlose Stecker)
sberder
4
@sberder Vielleicht solltest du auch eine Antwort auf diese Frage schreiben. Ich kann mir vorstellen, dass Sie es viel besser machen könnten als die akzeptierte Nichtantwort.
Kasperd

Antworten:

92

Es wird zur Herstellung von Hashes verwendet. Aussehen:

>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
quelle
9
Warum nannten sie es dann nicht Salz? ;)
Datenwolf
29
Dies ist eine Vermutung, aber ich nehme an, es ist einfacher, den Leuten zu sagen, "teile deine nicht SECRET_KEY", als "deine SALTist ein geheimer Schlüssel, den du für dich behalten solltest".
Roshan Mathews
12
Diese Unterscheidung ist sehr wichtig. In der Kryptographie sind Salze nicht geheim, sondern SECRET_KEYmüssen sicher aufbewahrt werden. Die Verwendung von SECRET_KEYähnelt viel eher der Verwendung eines Schlüssels in einem signierten Hash wie HMAC (der, wenn die Leistung nicht berücksichtigt würde, wahrscheinlich stattdessen verwendet würde).
Travis Jensen
32
Das sieht für mich nicht nach einer Antwort aus. Alles, was Sie getan haben, war ein einzelner grep-Befehl, ohne zu erklären, was dies bewirkt. Wo ist die Antwort auf "Was könnte passieren, wenn der Schlüssel kompromittiert wurde?"?
Kasperd
Da SECRET_KEY vertraulich ist, stellt das Präfixieren eines SECRET vor dem Schlüssel sicher, dass Django die Werte verschlüsselt / maskiert, wo immer dies erforderlich ist.
Linus_30
36

Die Django-Dokumentation für die kryptografische Signatur behandelt die Verwendung der Einstellung 'SECRET_KEY':

Dieser Wert [die SECRET_KEYEinstellung] ist der Schlüssel zum Sichern signierter Daten. Es ist wichtig, dass Sie diese Sicherheit gewährleisten. Andernfalls können Angreifer damit ihre eigenen signierten Werte generieren.

(Auf diesen Abschnitt wird auch in der Django-Dokumentation für die Einstellung 'SECRET_KEY' verwiesen .)

Die kryptografische Signatur-API in Django steht jeder App für kryptografisch sichere Signaturen von Werten zur Verfügung. Django selbst nutzt dies in verschiedenen übergeordneten Funktionen:

  • Signieren serialisierter Daten (z. B. JSON-Dokumente).

  • Eindeutige Token für eine Benutzersitzung, eine Anforderung zum Zurücksetzen des Kennworts, Nachrichten usw.

  • Verhinderung von standortübergreifenden oder Wiederholungsangriffen durch Hinzufügen (und Erwarten) eindeutiger Werte für die Anforderung.

  • Generieren eines einzigartigen Salzes für Hash-Funktionen.

Die allgemeine Antwort lautet also: Es gibt viele Dinge in einer Django-App, die eine kryptografische Signatur erfordern, und die Einstellung 'SECRET_KEY' ist der Schlüssel, der für diese verwendet wird. Es muss eine kryptografisch starke Entropie aufweisen (für Computer schwer zu erraten) und zwischen allen Django-Instanzen eindeutig sein.

große Nase
quelle
1
"und einzigartig zwischen allen Django-Instanzen." - Bedeutet dies, dass ich 3 verschiedene SECRET_KEYEinstellungen haben sollte, wenn ich 3 Webserver habe, auf denen dieselbe Django-App hinter einem Load Balancer ausgeführt wird ?
Adam Parkin
2
@AdamParkin, das klingt nach einem guten Start für eine neue Frage , um eine eigene Antwort zu bekommen.
Bignose
2
Toller Vorschlag, fertig: stackoverflow.com/questions/51657422/…
Adam Parkin
19

Laut der Django-Dokumentation überSECRET_KEY :

Der geheime Schlüssel wird verwendet für:

  • Alle Sitzungen, wenn Sie ein anderes Sitzungs-Backend als django.contrib.sessions.backends.cacheoder die Standardeinstellung verwendenget_session_auth_hash() .
  • Alle Nachrichten, wenn Sie CookieStorageoder verwenden FallbackStorage.
  • Alle PasswordResetView-Token.
  • Jede Verwendung von kryptografischer Signatur, sofern kein anderer Schlüssel angegeben ist.

Wenn Sie Ihren geheimen Schlüssel drehen, werden alle oben genannten Punkte ungültig. Geheime Schlüssel werden nicht für Kennwörter von Benutzern verwendet, und die Schlüsselrotation wirkt sich nicht auf sie aus.

Michael B.
quelle
5
Nützliche Informationen darüber, was passiert, wenn das SECRET_KEYgedreht wird. +1
Hassan Baig