Edycja: Ta odpowiedź jest oparta na django 1.5
SECRET_KEY
jest używany w wielu różnych miejscach, najpierw wskażę, na co ma to wpływ, a następnie spróbuję przejrzeć tę listę i podać dokładne wyjaśnienie wpływu.
Lista rzeczy wykorzystujących SECRET_KEY
bezpośrednio lub pośrednio:
W rzeczywistości wiele z wymienionych tutaj używać SECRET_KEY
przez django.utils.crypt.get_random_string()
który wykorzystuje go do materiału siewnego silnik losowego. Zmiana wartości nie wpłynie na to SECRET_KEY
.
Na wrażenia użytkowników, na które zmiana wartości ma bezpośredni wpływ, są:
- sesjach dekodowanie danych zostanie przerwane, co jest ważne dla dowolnego zaplecza sesji (pliki cookie, baza danych, plik lub pamięć podręczna).
- token resetowania hasła już wysłany nie będzie działać, użytkownicy będą musieli poprosić o nowy.
- formularz komentarza (jeśli jest używany
django.contrib.comments
) nie zostanie zatwierdzony, jeśli został poproszony przed zmianą wartości i przesłany po zmianie wartości. Myślę, że jest to bardzo niewielkie, ale może być mylące dla użytkownika.
- wiadomości (od
django.contrib.messages
) nie sprawdzą poprawności po stronie serwera w takich samych warunkach czasowych jak w przypadku formularza komentarza.
AKTUALIZACJA : teraz pracuję nad django 1.9.5, szybkie spojrzenie na źródło daje mi prawie takie same odpowiedzi. Może później dokona dokładnej inspekcji.
data decode will break
a może wskazać kod (w django lub przykładowym projekcie), który się zepsuje? EDYCJA: nadal używasz django 1.4 - czy tak jest?SECRET_KEY
jestsalted_hmac
używany do mieszania danych sesji.<algorithm>$<iterations>$<salt>$<hash>
w AUTH_USER, więc przypadkowy sól jest przechowywany obok hasła w każdym przypadku.Od czasu zadania tego pytania dokumentacja Django zmieniła się i zawiera odpowiedź.
Nie było dla mnie jasne, jak mam obrócić tajny klucz. Znalazłem dyskusję na temat tego, jak Django generuje klucz do nowego projektu , a także Gist, która omawia inne opcje . W końcu postanowiłem po prostu poprosić Django o utworzenie nowego projektu, skopiowanie nowego tajnego klucza do mojego starego projektu, a następnie usunięcie nowego projektu .
Aktualizacja
Wygląda na to, że Django dodał
get_random_secret_key()
funkcję w wersji 1.10. Możesz użyć tego do wygenerowania nowego tajnego klucza.źródło
startproject
, możesz zobaczyć, że generuje on losowy ciąg znaków za pomocącrypto
modułu.Według tej strony https://docs.djangoproject.com/en/dev/topics/signing/ , klucz SECRET_KEY jest używany głównie do przejściowych rzeczy - do podpisywania danych przesyłanych przewodowo, dzięki czemu można na przykład wykryć sabotaż. Wygląda na to, że MOGĄ się złamać:
Ktoś z bardziej aktualnym i / lub istotnym doświadczeniem Django ode mnie może zagrać inaczej, ale podejrzewam, że jeśli nie robisz czegoś wyraźnie z interfejsem API do podpisywania, powinno to powodować jedynie niewielką niedogodność dla użytkowników.
źródło
Ciąg SECRET_KEY służy przede wszystkim do szyfrowania i / lub mieszania danych cookie. Wiele frameworków (w tym Django) przychodzi do tego, ponieważ domyślne pliki cookie sesji mają swoje wady.
Wyobraź sobie, że masz formularz w django do edytowania artykułów z ukrytym polem. W tym ukrytym polu przechowywany jest identyfikator edytowanego artykułu. A jeśli chcesz mieć pewność, że nikt nie wyśle Ci żadnego innego identyfikatora artykułu, dodasz dodatkowe ukryte pole z hashowanym identyfikatorem. Więc jeśli ktoś zmieni identyfikator, będziesz o tym wiedział, ponieważ skrót nie będzie taki sam.
Oczywiście jest to trywialny przykład, ale w ten sposób używany jest SECRET_KEY.
Django wewnętrznie używa go na przykład do {% csrf_token%} i kilku innych rzeczy. To naprawdę nie powinno mieć żadnego wpływu na twoją aplikację, jeśli ją zmienisz, w oparciu o twoje pytanie i że nie używasz jej.
Jedyną rzeczą jest to, że może wartości sesji zostaną usunięte. Na przykład użytkownicy będą musieli ponownie zalogować się do administratora, ponieważ django nie będzie w stanie dekodować sesji przy użyciu innego klucza.
źródło
Popełniłem ten sam błąd. Domyślne hasło miało długość 50, więc użyłem programu PowerShell do wygenerowania losowego ciągu o długości 50 i zastąpiłem go starym kluczem SECRET_KEY. Byłem zalogowany i po wymianie klucza SECRET_KEY moja poprzednia sesja została unieważniona.
Z Powershell ( źródło ):
Z Bash ( źródło ):
W tym momencie pomyślałem, dlaczego nie spróbować większego klucza, więc wypróbowałem go z kluczem o długości 100 i 1000. Oba działały. Jeśli rozumiem kod źródłowy , obiekt zwrócony przez funkcję osoby podpisującej jest skrótem hmac w base64. RFC 2104 ma to do powiedzenia na temat wymaganej długości tajnego klucza HMAC.
Aby przetłumaczyć na zwykłe mówienie, rozmiar tajnego klucza musi być tego samego rozmiaru co wynik. Klucz musi być również w bitach. Każda cyfra w base64 reprezentuje 6 bitów. Więc jeśli miałbyś 50-znakowe hasło, miałbyś tajny klucz 50 x 6 = 300 bitów. Jeśli używasz SHA256, potrzebujesz 256-bitowego klucza ( sha256 z definicji używa 256 bitów ). Dlatego 50 długie hasło powinno działać, chyba że planujesz użyć algorytmu skrótu większego niż SHA256.
Ale ponieważ wszelkie dodatkowe bity klucza są haszowane, jego rozmiar nie drastycznie obniży wydajność. Ale to zagwarantuje ci, że masz wystarczającą ilość bitów do większych funkcji skrótu. SHA-512 byłby objęty 100 długim kluczem SECRET_KEY ( 50 x 6 = 600 bitów> 512 bitów ).
źródło