/ / Sicherer Verschlüsselungsschlüssel aus Benutzerkennwort generiert? - Django, Sicherheit, Verschlüsselung, Hash, Kryptographie

Sicher generierter Schlüssel aus dem Passwort des Benutzers? - Django, Sicherheit, Verschlüsselung, Hash, Kryptographie

Ich baue eine Django-Website mit MySQL. Ich habe mich bereits für die Verwendung von Djangos eingebauten pbkdf2-sha256 mit zufällig generiertem Salt-Hash entschieden, um das Passwort eines Benutzers zu speichern.

Diese Website muss jedoch auch gespeichert werdenAnmeldeinformationen von Drittanbietern für viele andere Websites (die nicht oauth verwenden). Ich habe mir also die AES-256-Verschlüsselung angesehen.

Jetzt hier meine Lösung: Jeder Verschlüsselungsschlüssel = der Hash des tatsächlichen Passworts des Benutzers und ein zufällig generiertes Salt (abweichend von dem Salt, das bereits für das Passwort des Passworts verwendet wurde). Das Salt würde in der Tabelle gespeichert sein, das eigentliche Passwort und der Hash davon natürlich nicht. Der Verschlüsselungsschlüssel würde also bei der Anmeldung generiert und temporär gespeichert, er verfällt jedoch beim Abmelden. Außerdem kann der Server, der den Server gefährdet, den Verschlüsselungsschlüssel nicht generieren, ohne den ursprünglichen pbkdf2-sha256-Hash zu knacken, und selbst dann wäre es nur für diesen einen Benutzer ein universeller Schlüssel.

Der Nachteil ist, dass sie sich ändern / zurücksetzenKennwort, müssen sie ihre Anmeldeinformationen für jeden Standort erneut eingeben. Aber das ist keine große Sache und scheint viel sicherer zu sein, als den Schlüssel irgendwo auf dem Server oder sogar auf einem anderen Server zu speichern.

Aber ich habe erst vor 24 Stunden gelernt, was ein Hash ist. Was weiß ich? Übersehe ich etwas oder ist das einigermaßen sicher? Oder gibt es einen besseren Weg?

Antworten:

3 für die Antwort № 1

Der Algorithmus PBKDF2 die Sie erwähnen, ist eigentlich für diesen expliziten Zweck konzipiert.

Der Workflow wäre also die Erzeugung eines zufälligen Salt. Dann speichern Sie das in der Datenbank für den Benutzer.

Erzeugen Sie mit PBKDF2 mit hoher Iterationszahl und dem Salt-Wert 640 Bit Schlüsselmaterial (80 Byte).

Die ersten 128 Bits werden zur IV für die Chiffre

Die nächsten 256 Bits werden zum Chiffrierschlüssel (der für AES-256 verwendete Schlüssel).

Die letzten 256 Bits werden zum MAC-Schlüssel (der zum Authentifizieren der Verschlüsselung verwendete Schlüssel).

key = PBKDF2-SHA256(password, salt, 50000, 80)
iv = key[0:128]
cipherKey = key[128:384]
macKey = key[384:640]

Dann verschlüsseln Sie die Daten mit diesen Schlüsseln (Pseudo-Code):

ciphertext = AES-256-CBC(data, cipherKey, iv)
authtext = SHA256-HMAC(ciphertext, macKey)
result = "{}{}".format(authtext, ciphertext)

Nun, beim Entschlüsseln, gehe einfach zurück ...

key = PBKDF2-SHA256(password, salt, 50000, 80)
iv = key[0:128]
cipherKey = key[128:384]
macKey = key[384:640]

authtext = result[0:32]
ciphertext = result[32:]

if !timingSafeComparison(authtext, SHA256-HMAC(ciphertext, macKey)):
return false

return AES-256-CBC-DECRYPT(ciphertext, cipherKey, iv)

Ja, wenn Ihr Benutzer das Kennwort vergisst, sind alle verschlüsselten Daten verschwunden. Aber das wollen Sie doch?