Scopo dell'impostazione di Django "SECRET_KEY"


157

Qual è esattamente il punto di SECRET_KEYin in django? Ho fatto alcune ricerche su Google e verificato i documenti ( https://docs.djangoproject.com/en/dev/ref/settings/#secret-key ), ma stavo cercando una spiegazione più approfondita di questo, e perché è richiesto.

Ad esempio, cosa potrebbe accadere se la chiave fosse compromessa / altri sapessero cosa fosse? Grazie.


4
Se hai una chiave segreta, ed è compromessa e rilasciata ad altri, hai un problema. Non importa se stai usando Django o no.
Jared Farrish,

35
Ma quale problema, esattamente?
incontro il

7
Ho fatto una risposta completa qui (spina spudorata)
sberder

4
@sberder Forse dovresti scrivere anche una risposta a questa domanda. Immagino che potresti farlo molto meglio della non risposta accettata.
Kasperd,

Risposte:


92

È usato per fare hash. Guarda:

>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
Perché non l'hanno chiamato sale allora? ;)
datenwolf,

29
Questa è una supposizione, ma suppongo che sia più facile dire alla gente "non condividere il tuo SECRET_KEY", al contrario di "la tua SALTè una chiave segreta che dovresti tenere per te".
Roshan Mathews,

12
Questa distinzione è molto importante. Nella crittografia, i sali non sono segreti, ma SECRET_KEYdevono essere tenuti al sicuro. L'uso di the SECRET_KEYè molto più simile all'uso di una chiave in un hash firmato come HMAC (che, se le prestazioni non fossero una considerazione, probabilmente verrebbe usato invece).
Travis Jensen,

32
Questa non mi sembra una risposta. Tutto quello che hai fatto è stato un singolo comando grep senza spiegare ciò che fa. Dov'è la risposta a "cosa potrebbe accadere se la chiave fosse compromessa?"?
Kasperd,

Inoltre, poiché SECRET_KEY è riservato, il prefisso di un SECRET sulla chiave garantisce che Django crittograferà / maschererà i valori dove mai necessario.
Linus_30,

36

La documentazione di Django per la firma crittografica copre gli usi dell'impostazione "SECRET_KEY":

Questo valore [l' SECRET_KEYimpostazione] è la chiave per proteggere i dati firmati - è fondamentale tenerlo al sicuro, o gli aggressori potrebbero usarlo per generare i propri valori firmati.

(Questa sezione fa anche riferimento alla documentazione di Django per l'impostazione "SECRET_KEY" .)

L'API di firma crittografica in Django è disponibile per qualsiasi app per firme crittograficamente sicure sui valori. Django stesso si avvale di questo in varie funzionalità di livello superiore:

  • Firma di dati serializzati (ad es. Documenti JSON).

  • Token univoci per una sessione utente, richiesta di reimpostazione password, messaggi, ecc.

  • Prevenzione di attacchi cross-site o replay aggiungendo (e quindi prevedendo) valori univoci per la richiesta.

  • Generare un sale unico per le funzioni di hash.

Quindi, la risposta generale è: ci sono molte cose in un'app Django che richiedono una firma crittografica e l'impostazione 'SECRET_KEY' è la chiave utilizzata per quelle. Deve avere una quantità di entropia crittograficamente forte (difficile da indovinare per i computer) e unica tra tutte le istanze di Django.


1
"e unico tra tutte le istanze di Django." - questo implica che se avessi 3 server web con la stessa app Django dietro un bilanciamento del carico dovrei avere 3 SECRET_KEYimpostazioni distinte ?
Adam Parkin,

2
@AdamParkin, sembra un buon inizio per una nuova domanda , per ottenere la propria risposta.
bignose il


19

Secondo la documentazione di Django suSECRET_KEY :

La chiave segreta viene utilizzata per:

  • Tutte le sessioni se si utilizza un back-end di sessione diverso da django.contrib.sessions.backends.cacheo si utilizza l'impostazione predefinita get_session_auth_hash().
  • Tutti i messaggi se si sta utilizzando CookieStorageo FallbackStorage.
  • Tutti i token PasswordResetView.
  • Qualsiasi utilizzo della firma crittografica, a meno che non venga fornita una chiave diversa.

Se si ruota la chiave segreta, tutto quanto sopra verrà invalidato. Le chiavi segrete non vengono utilizzate per le password degli utenti e la rotazione delle chiavi non li influenzerà.


5
Informazioni utili su cosa succede se SECRET_KEYviene ruotato. +1
Hassan Baig,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.