Bearbeiten: Diese Antwort basiert auf Django 1.5
SECRET_KEY
wird an vielen verschiedenen Orten verwendet. Ich werde zuerst darauf hinweisen, was davon betroffen ist, und dann versuchen, diese Liste durchzugehen und die Auswirkungen genau zu erklären.
Die Liste der Dinge, die SECRET_KEY
direkt oder indirekt verwendet werden:
In der Realität nutzen viele der hier aufgeführten SECRET_KEY
durch django.utils.crypt.get_random_string()
denen es verwendet den Zufall Motor auf Saatgut. Dies wird durch eine Wertänderung von nicht beeinflusst SECRET_KEY
.
Die Benutzererfahrung, die direkt von einer Wertänderung betroffen ist, ist:
- In Sitzungen wird die Datendecodierung unterbrochen, die für jedes Sitzungs-Backend (Cookies, Datenbank, dateibasiert oder Cache) gültig ist.
- Das bereits gesendete Token zum Zurücksetzen des Passworts funktioniert nicht. Benutzer müssen ein neues Token anfordern.
- Das Kommentarformular (falls verwendet
django.contrib.comments
) wird nicht validiert, wenn es vor der Wertänderung angefordert und nach der Wertänderung übermittelt wurde. Ich denke, das ist sehr geringfügig, könnte aber für den Benutzer verwirrend sein.
- Nachrichten (von
django.contrib.messages
) werden serverseitig nicht unter den gleichen Zeitbedingungen wie für das Kommentarformular validiert.
UPDATE : Wenn ich jetzt an Django 1.9.5 arbeite, gibt mir ein kurzer Blick auf die Quelle so ziemlich die gleichen Antworten. Könnte später eine gründliche Inspektion durchführen.
data decode will break
darauf eingehen, was Sie damit meinen, und vielleicht auf einen Code (in Django oder Beispielprojekt) hinweisen, der kaputt geht? EDIT: immer noch mit Django 1.4 - ist das der Fall?SECRET_KEY
in verwendet wirdsalted_hmac
verwendet , um Hash die Sitzungsdaten.<algorithm>$<iterations>$<salt>$<hash>
in auth_user gespeichert , so dass das zufällige Salt jeweils neben dem Passwort gespeichert wird.Seitdem diese Frage gestellt wurde, wurde die Django-Dokumentation geändert und enthält nun eine Antwort.
Mir war nicht genau klar, wie ich den geheimen Schlüssel drehen sollte. Ich fand eine Diskussion darüber, wie Django einen Schlüssel für ein neues Projekt generiert , sowie eine Übersicht, in der andere Optionen besprochen werden . Ich beschloss schließlich, Django dazu zu bringen, ein neues Projekt zu erstellen, den neuen geheimen Schlüssel in mein altes Projekt zu kopieren und dann das neue Projekt zu löschen .
Aktualisieren
Es sieht so aus, als hätte Django die
get_random_secret_key()
Funktion in Version 1.10 hinzugefügt . Damit können Sie einen neuen geheimen Schlüssel generieren.quelle
startproject
ansehen , können Sie sehen, dass er mit demcrypto
Modul nur eine zufällige Zeichenfolge generiert .Laut dieser Seite https://docs.djangoproject.com/de/dev/topics/signing/ wird SECRET_KEY hauptsächlich für vorübergehende Daten verwendet - zum Signieren von Daten, die über das Kabel gesendet werden, damit Sie beispielsweise Manipulationen erkennen können. Es sieht so aus, als könnten folgende Dinge kaputt gehen:
Jemand mit einer neueren und / oder herausragenden Django-Erfahrung als ich mischt sich möglicherweise anders ein, aber ich vermute, dass dies nur eine leichte Unannehmlichkeit für Ihre Benutzer darstellen sollte, wenn Sie nicht explizit etwas mit der Signatur-API tun.
quelle
Die SECRET_KEY-Zeichenfolge wird hauptsächlich zum Verschlüsseln und / oder Hashing von Cookie-Daten verwendet. Viele Frameworks (einschließlich Django) kommen dazu, da Standard-Sitzungscookies ihre eigenen Nachteile haben.
Stellen Sie sich vor, Sie haben in Django ein Formular zum Bearbeiten von Artikeln mit einem ausgeblendeten Feld. In diesem ausgeblendeten Feld wird die ID des Artikels gespeichert, den Sie bearbeiten. Und wenn Sie sicher sein möchten, dass Ihnen niemand eine andere Artikel-ID senden kann, fügen Sie ein zusätzliches verstecktes Feld mit der Hash-ID hinzu. Wenn also jemand die ID ändert, wissen Sie es, weil der Hash nicht der gleiche ist.
Natürlich ist dies ein triviales Beispiel, aber so wird SECRET_KEY verwendet.
Django verwendet es intern zum Beispiel für {% csrf_token%} und einige andere Dinge. Es sollte wirklich keine Auswirkungen auf Ihre Anwendung haben, wenn Sie sie aufgrund Ihrer Frage ändern und nicht verwenden.
Die einzige Sache ist , dass vielleicht werden die Sitzungswerte fallen gelassen werden. So müssen sich Benutzer beispielsweise erneut bei admin anmelden, da django keine Sitzung mit einem anderen Schlüssel dekodieren kann.
quelle
Ich habe den gleichen Fehler gemacht. Das Standardkennwort war 50 lang, also habe ich Powershell verwendet, um eine 50 lange lange Zeichenfolge zu generieren, und das alte SECRET_KEY durch dieses ersetzt. Ich war angemeldet und nach dem Ersetzen von SECRET_KEY war meine vorherige Sitzung ungültig.
Mit Powershell ( Quelle ):
Mit Bash ( Quelle ):
An diesem Punkt dachte ich mir, warum ich nicht einen größeren Schlüssel probieren sollte, also versuchte ich es mit einem 100 und 1000 langen Schlüssel. Beide haben funktioniert. Wenn ich den Quellcode verstehe , ist das von der Signiererfunktion zurückgegebene Objekt ein hmac-Hash in base64. RFC 2104 hat dies für die erforderliche Länge eines geheimen HMAC-Schlüssels zu sagen.
Um in normales Sprechen zu übersetzen, muss die Größe des geheimen Schlüssels der Größe der Ausgabe entsprechen. Der Schlüssel muss auch in Bits sein. Jede Ziffer in base64 repräsentiert 6 Bits. Wenn Sie also ein 50-stelliges Passwort hätten, hätten Sie einen geheimen 50 x 6 = 300-Bit-Schlüssel. Wenn Sie SHA256 verwenden, benötigen Sie einen 256-Bit-Schlüssel ( sha256 verwendet per Definition 256 Bit ). Ein 50-langes Passwort sollte also funktionieren, es sei denn, Sie planen, einen Hashing-Algorithmus zu verwenden, der größer als SHA256 ist.
Da jedoch zusätzliche Bits im Schlüssel gehasht werden, wird die Leistung durch die Größe des Schlüssels nicht drastisch verringert. Aber es würde Ihnen garantieren, dass Sie genug Bits für größere Hash-Funktionen haben. SHA-512 würde von einem 100 langen SECRET_KEY ( 50 x 6 = 600 Bit> 512 Bit ) abgedeckt .
quelle