2017-01-18 3 views
1

Es ist unmöglich, Passwörter eines Benutzers in einer Django-App, durch Design zu bekommen.Passwort Zeichenfolge Vergleich in Django App

Ich implementiere eine change password-Funktion für meine Django-App, und eine der Anforderungen besteht darin, sicherzustellen, dass Benutzer kein neues Passwort behalten, das das gleiche wie das vorherige ist.

Ich kann hier keinen Stringvergleich durchführen, also was ist das optimale Muster in diesem Fall?

Hier ist, was ich denke: Zugriff auf meine change password-Funktion erfordert Re-Auth (d. H. Benutzer müssen den Pass erneut eingeben). Ich kann möglicherweise die Kennwortzeichenfolge in einer Sitzungsvariablen an diesem Punkt speichern (z. B. session.request['old_password']) und dann diese Sitzungsvariable mit der Zeichenfolge des neuen Kennworts vergleichen, das der Benutzer einstellt. Irgendwelche Sicherheitsbedenken mit dieser Art von Mustern?

+0

Hash das neue Passwort und vergleichen Sie es mit Hashes der alten Passwörter. – RemcoGerlich

Antwort

5

Sie müssen das alte Passwort nicht in einer Sitzung speichern, und Sie sollten es auch nicht tun. Da die Sitzungsdaten im Sitzungsspeicher gespeichert werden und für den kurzen Zeitraum, wenn das Kennwort geändert wird, ist es im Nur-Text-Format vorhanden. Theoretisch könnte ein Angreifer ein Datenbankereignis oder einen Auslöser verwenden, um diese Nur-Text-Passwortobjekte zu erfassen. Der bessere Ansatz wäre die Verwendung von Djangos eingebautem password functions.

check_password (Passwort, verschlüsselt) Wenn Sie möchten manuell einen Benutzer authentifizieren, indem ein Klartext-Passwort an die gehasht Passwort in der Datenbank zu vergleichen, verwenden Sie die Komfortfunktion check_password(). Es braucht zwei Argumente: das Klartext-Passwort zu überprüfen, und den vollen Wert eines Benutzer-Passwort-Felds in der Datenbank zu überprüfen, und gibt True, wenn sie übereinstimmen, andernfalls False.

In Ihrem Fall müssten Sie ein benutzerdefiniertes Formular erstellen, das diese Methode als Teil der clean() -Methode aufruft. Wenn der obige Funktionsaufruf wahr zurückgibt, müssen Sie einen Überprüfungsfehler auslösen, der besagt, dass das alte Kennwort wiederverwendet wird.

+0

Oder besser noch ... schreiben Sie einen benutzerdefinierten Passwort-Validator, so dass 'set_password' es für Sie tut ... :) – Sayse

+0

Hallo @Sayse, das ist ein ziemlich guter Vorschlag. Warum nicht eine Antwort schreiben? – e4c5

+1

Danke, aber es fühlt sich eher wie ein Addendum zu deiner schon ziemlich vollständigen Antwort an. – Sayse

2

Nach meinem Vorschlag unter e4c5's Antwort, es würde aussehen, als ob es bestehende Pakete wie Django Password Validator, die dies für Sie tun, so dass Sie nicht wirklich selbst schreiben müssen.

Im Prinzip scheint es, dass dies funktioniert, indem die zuvor verwendeten Hash-Passwörter in einer Datenbank gespeichert und dann das neue Hash-Passwort mit den aktuell gespeicherten verglichen wird.

Weitere Informationen finden Sie unter the source code für ihren Prüfer.

+0

Danke, ich schau es Dir an :-) –