Cel ustawienia Django „SECRET_KEY”


157

Jaki dokładnie jest sens SECRET_KEYin django? Przeprowadziłem kilka wyszukiwań w Google i sprawdziłem dokumenty ( https://docs.djangoproject.com/en/dev/ref/settings/#secret-key ), ale szukałem bardziej szczegółowego wyjaśnienia tego, i dlaczego jest to wymagane.

Na przykład, co mogłoby się stać, gdyby klucz został przejęty / inni wiedzieli, co to jest? Dziękuję Ci.


4
Jeśli masz tajny klucz, który został naruszony i udostępniony innym, masz problem. Nie ma znaczenia, czy używasz Django, czy nie.
Jared Farrish,

35
Ale jaki dokładnie problem?
tobych

7
Zrobiłem gruntowną odpowiedź tutaj (bezwstydny wtyczkę)
sberder

4
@sberder Może powinieneś również napisać odpowiedź na to pytanie. Wyobrażam sobie, że mógłbyś to zrobić znacznie lepiej niż zaakceptowana brak odpowiedzi.
kasperd

Odpowiedzi:


92

Służy do tworzenia skrótów. Popatrz:

>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
Dlaczego wtedy nie nazwali tego solą? ;)
datenwolf

29
To przypuszczenie, ale przypuszczam, że łatwiej jest powiedzieć ludziom „nie udostępniaj swojego SECRET_KEY”, niż „twój SALTjest tajnym kluczem, który powinieneś zachować dla siebie”.
Roshan Mathews

12
To rozróżnienie jest bardzo ważne. W kryptografii sole nie są tajemnicą, ale SECRET_KEYmuszą być bezpieczne. Użycie the SECRET_KEYjest znacznie bardziej zbliżone do użycia klucza w podpisanym skrócie, takim jak HMAC (który, gdyby wydajność nie był brany pod uwagę, prawdopodobnie zostałby użyty zamiast tego).
Travis Jensen

32
To nie wygląda na odpowiedź dla mnie. Wszystko, co zrobiłeś, to jedno polecenie grep bez wyjaśnienia, co robi. Gdzie jest odpowiedź na pytanie „co mogłoby się stać, gdyby klucz został przejęty?”?
kasperd

Ponieważ klucz SECRET_KEY jest poufny, przedrostek SECRET przed kluczem zapewnia, że ​​Django zaszyfruje / zamaskuje wartości, gdziekolwiek będzie to potrzebne.
Linus_30

36

Dokumentacja Django dotycząca podpisów kryptograficznych obejmuje zastosowania ustawienia „SECRET_KEY”:

Ta wartość [ SECRET_KEYustawienie] jest kluczem do zabezpieczenia podpisanych danych - ważne jest, aby zachować to bezpieczeństwo, w przeciwnym razie atakujący mogą użyć jej do wygenerowania własnych podpisanych wartości.

(Do tej sekcji odwołuje się również dokumentacja Django dotycząca ustawienia „SECRET_KEY” ).

Interfejs API do podpisywania kryptograficznego w Django jest dostępny dla każdej aplikacji w celu zapewnienia kryptograficznie bezpiecznych podpisów wartości. Samo Django wykorzystuje to w różnych funkcjach wyższego poziomu:

  • Podpisywanie danych serializowanych (np. Dokumenty JSON).

  • Unikalne tokeny dla sesji użytkownika, prośby o zresetowanie hasła, wiadomości itp.

  • Zapobieganie atakom typu cross-site lub replay poprzez dodawanie (a następnie oczekiwanie) unikalnych wartości dla żądania.

  • Generowanie unikalnej soli do funkcji haszyszu.

Zatem ogólna odpowiedź brzmi: jest wiele rzeczy w aplikacji Django, które wymagają podpisu kryptograficznego, a ustawienie 'SECRET_KEY' jest do nich kluczem. Musi mieć silną kryptograficznie ilość entropii (trudną do odgadnięcia dla komputerów) i unikalną między wszystkimi instancjami Django.


1
„i niepowtarzalny między wszystkimi instancjami Django”. - czy to oznacza, że ​​jeśli mówię, że mam 3 serwery internetowe z tą samą aplikacją Django za modułem równoważenia obciążenia, powinienem mieć 3 różne SECRET_KEYustawienia?
Adam Parkin

2
@AdamParkin, brzmi to jak dobry początek dla nowego pytania , aby uzyskać własną odpowiedź.
bignose


19

Zgodnie z dokumentacją Django na tematSECRET_KEY :

Tajny klucz służy do:

  • Wszystkie sesje, jeśli używasz innego zaplecza sesji niż django.contrib.sessions.backends.cachelub używasz domyślnego get_session_auth_hash().
  • Wszystkie wiadomości, jeśli używasz CookieStoragelub FallbackStorage.
  • Wszystkie tokeny PasswordResetView.
  • Jakiekolwiek użycie podpisu kryptograficznego, chyba że podano inny klucz.

Jeśli obrócisz swój tajny klucz, wszystkie powyższe zostaną unieważnione. Tajne klucze nie są używane do haseł użytkowników i rotacja kluczy nie ma na nie wpływu.


5
Przydatne informacje dotyczące tego, co się stanie, jeśli SECRET_KEYzostanie obrócony. +1
Hassan Baig
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.