2011-09-11 9 views
76

Jaki jest dokładnie punkt SECRET_KEY w django? Zrobiłem kilka wyszukiwań google i sprawdziłem dokumenty (https://docs.djangoproject.com/en/dev/ref/settings/#secret-key), ale szukałem bardziej dogłębnego wyjaśnienia tego i dlaczego jest ono wymagane.Cel ustawienia Django 'SECRET_KEY'

Na przykład, co może się stać, jeśli klucz został naruszony/inni wiedzieli, co to było? Dziękuję Ci.

+3

Jeśli masz tajny klucz, a jest on naruszony i udostępniony innym, masz problem. Nie ma znaczenia, czy używasz Django, czy nie. –

+19

Ale jaki problem, dokładnie? – tobych

+3

Zrobiłem dokładną odpowiedź [tutaj] (http://stackoverflow.com/questions/15170637/effects-of-changing-djangos-secret-key/15383766?noredirect=1#comment21743494_15383766) (wtyczka bezwstydna) – sberder

Odpowiedz

60

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

>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() 
+4

Dlaczego więc nie nazwali tego solą? ;) – datenwolf

+9

To jest domysły, ale przypuszczam, że łatwiej jest powiedzieć ludziom "nie dziel się swoim kluczem" SECRET_KEY ", w przeciwieństwie do" twojej 'SALT" to tajny klucz, który powinieneś zachować dla siebie. " –

+5

To rozróżnienie jest bardzo ważne. W kryptografii sole nie są tajne, ale 'SECRET_KEY' musi być bezpieczny. Użycie '' SECRET_KEY' jest znacznie bardziej zbliżone do użycia klucza w podpisanym haszu, takim jak HMAC (który, gdyby wydajność nie była rozważana, prawdopodobnie zostałby użyty zamiast tego). –

2

Django documentation for cryptographic signing obejmuje zastosowań zachodzącego „SECRET_KEY”:

Ta wartość [ustawienie SECRET_KEY] jest kluczem do zapewnienia podpisane dane - ważne jest zachować to bezpieczne, lub osoby atakujące mogą użyć go do wygenerowania własnych wartości podpisanych.

(Ta sekcja jest również odwołanie od the Django documentation for the ‘SECRET_KEY’ setting).

Kryptograficzna podpisanie w Django API jest dostępne dla każdej aplikacji dla kryptograficznie bezpiecznych podpisów na wartości. Django wykorzystuje to na różne funkcje wyższego poziomu:

  • Signing serialised data (na przykład dokumenty JSON).

  • Unikalne tokeny dla sesji użytkownika, żądanie resetowania hasła, wiadomości itp

  • Zapobiegania cross-site lub atakami replay dodając (a następnie spodziewa) unikatowe wartości dla żądania.

  • Generowanie unikalnej soli dla funkcji skrótu.

więc ogólna odpowiedź brzmi: Istnieje wiele rzeczy w aplikacji Django, które wymagają podpisu kryptograficznego i ustawienie „SECRET_KEY” to klucz używany do nich. Musi mieć kryptograficznie dużą ilość entopii (trudną do odgadnięcia przez komputer) i unikalną pomiędzy wszystkimi instancjami Django.

Powiązane problemy