it-swarm.com.de

Wie kann verhindert werden, dass Benutzername und Passwort übereinstimmen, wenn ein Benutzername geändert wird?

Angenommen, ich habe ein System, bei dem eine der Sicherheitsanforderungen darin besteht, Benutzer daran zu hindern, ein Kennwort zu wählen, das ihrem Benutzernamen entspricht. Benutzernamen unterscheiden nicht zwischen Groß- und Kleinschreibung, die Kennwörter jedoch. Die Passwörter werden vom Server mithilfe einer sicheren Hashing-Funktion gespeichert, die nicht rückgängig gemacht werden kann.

Wenn das Konto erstellt wird, stehen dem Server zunächst sowohl der Benutzername als auch das Kennwort im Klartext zum Vergleich zur Verfügung. Wir können sie im Speicher vergleichen (ohne Berücksichtigung der Groß- und Kleinschreibung), um festzustellen, ob sie übereinstimmen, und den Benutzer anweisen, in diesem Fall ein anderes Kennwort zu wählen. Sobald diese Prüfung abgeschlossen ist, wird das Passwort sicher zur Speicherung gehasht, während der Benutzername im Klartext gespeichert wird. Keine Probleme, die Anforderung hier zu erfüllen.

Wenn der Benutzer sein Kennwort ändern möchte oder es für ihn geändert wird, kann der Server seinen Benutzernamen-Datensatz abrufen und ihn mit dem neu ausgewählten Kennwortwert vergleichen (wobei Groß- und Kleinschreibung erneut ignoriert wird), um festzustellen, ob er übereinstimmt. Auch hier gibt es keine Probleme, die Anforderungen zu erfüllen.

Das System erlaubt jedoch auch Änderungen des Benutzernamens. Während dieses ID-Änderungsprozesses hat der Benutzer dem Server nicht unbedingt sein Kennwort im Klartext mitgeteilt. Möglicherweise haben sie dies bei der Authentifizierung getan, aber der Server wird dieses Kennwort nicht im Klartext speichern, nur für den Fall, dass sie ihren Benutzernamen ändern möchten. Daher ist das Klartextkennwort nicht verfügbar, um nach einer Übereinstimmung mit dem neu ausgewählten Benutzernamen zu suchen.

Um unsere Anforderungen zu erfüllen, kann der Server dieselbe sichere Hashing-Funktion verwenden, um den neuen Benutzernamen zu hashen und ihn mit dem aufgezeichneten Hash-Passwort zu vergleichen. Wenn sie übereinstimmen, kann der Server den Benutzer anweisen, einen anderen Benutzernamen zu wählen. Da der Benutzername jedoch nicht zwischen Groß- und Kleinschreibung unterscheidet, schlägt diese Prüfung möglicherweise fehl, wenn sie möglicherweise wahr ist. Wenn ich "PwdRsch1" als neuen Benutzernamen einreiche und mein Passwort "pwdrsch1" lautet, lässt das System dies zu, da die Hashes nicht übereinstimmen. Ich - oder schlimmer noch ein Angreifer - konnte mich später erfolgreich mit dem passenden Benutzernamen und Passwort "pwdrsch1" authentifizieren.

Wir könnten den Benutzernamen in Kleinbuchstaben zwingen, bevor wir ihn hashen und mit dem Passwort vergleichen, aber dann ist das umgekehrte Szenario möglich. Der Benutzername würde als "pwdrsch1" gegen ein Passwort von "PwdRsch1" geprüft und erlaubt, da diese nicht übereinstimmen. Aber später kann ich mich erfolgreich mit einem passenden Benutzernamen und Passwort von "PwdRsch1" authentifizieren.

Welche vernünftigen Optionen habe ich, um das Risiko zu verringern, dass ein Passwort mit einem Benutzernamen übereinstimmt, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird?

34
PwdRsch

Der einzig sinnvolle Weg, um das zu bekommen, was Sie wollen, besteht darin, nach dem Passwort zu fragen, wenn ein Benutzer seinen Benutzernamen ändert. Auf diese Weise verfügt der Server immer über die Informationen, die erforderlich sind, um während einer Änderung einen genauen Vergleich zwischen Benutzername und Kennwort durchzuführen und Übereinstimmungen zu verhindern.

Da vertrauliche Vorgänge - wie das Ändern von Kennwörtern oder in Ihrem Fall Benutzernamen - ohnehin ein Kennwort erfordern sollten (um den Schaden von XSS zu begrenzen), sollte dies kein Problem sein.

Ihre einzige andere Alternative besteht darin, jede mögliche Fallkombination auszuprobieren, sie zu hashen und diese mit dem gespeicherten Hash zu vergleichen, wenn ein Benutzer seinen Benutzernamen ändert.

108
tim

Ein wenig gegen den Strich gehen - nicht egal, ob der Benutzername in eine "im Wesentlichen ähnliche" Zeichenfolge wie das Passwort geändert wird. Warnen Sie Benutzer vor der Gefahr, dasselbe Kennwort auszuwählen, und prüfen Sie, ob identisch übereinstimmt.

Egal wie viele Regeln Sie einrichten, wenn der Benutzer fest entschlossen ist, findet er einen Weg, um sie zu umgehen. Wenn Sie müssen, fragen Sie bei der Änderung des Benutzernamens nach dem Kennwort, damit Sie sie in dasselbe Gehäuse zwingen können, oder lassen Sie es einfach durch und überprüfen Sie, wann sie sich das nächste Mal anmelden, und erzwingen Sie dann eine Benutzer-/Passänderung.

Die nur Zeit, in der dies von Bedeutung ist, ist, wenn Ihre Benutzer einem gezielten Angriff ausgesetzt sind. Wenn ein Kiddie mit zufälligem Skript (oder ein anderer Opportunist) die Benutzerliste in den Griff bekommt, verfügt er über weitaus ausgefeiltere Tools, um diese Kennwörter zu knacken, als zu versuchen, mit dem Benutzernamen übereinzustimmen. Dies gilt auch für den anvisierten Angreifer, aber er kann mit einfachen Dingen beginnen, die er selbst in die Tastatur eingeben kann. Und wenn es sich um eine intelligente Person handelt, die versucht, das Passwort "PwdRsch1" zu knacken, sind Sie dann wirklich sicher, wenn Sie nur die Unterschiede zwischen den Fällen überprüfen? Was ist mit "pwdr5ch1"? "PwdRsch2"? "1hcsRdwP"? Sie können Regeln für jedes dieser denkbaren Szenarien schreiben, aber entweder gibt es eines, das Sie vergessen haben, oder Sie machen es so schwierig, eine Kombination aus Benutzername und Passwort auszuwählen, dass sie nur mit "P4ssw0rd!" und damit fertig sein.

Bildung ist die einzige Möglichkeit, Ihre Benutzer dazu zu bringen, wirklich sichere Passwörter zu verwenden, und es wird immer solche geben, die diese nicht erfüllen.

13
Jason

Angenommen, der Benutzername enthält 10 Buchstaben. Das sind 1024 verschiedene Kombinationen von Groß- und Kleinschreibung. Überprüfen Sie sie alle.

Speichern Sie den Passwort-Hash in Kleinbuchstaben nicht. Dieser 1024 mag Ihnen unpraktisch erscheinen, aber für einen Angreifer ist es der Unterschied zwischen einem Tag und drei Jahren.

8
PyRulez

Sie sollten Benutzer-IDs und Kennwörter erzwingen, die aus verschiedenen Gruppen stammen. In den Kommentaren scheint es, dass die Benutzer-ID aus dem legalen Namen des Benutzers in einer formelhaften Weise "John Smith" -> "jsmith" und "Jane Doe" -> "jdoe" folgen muss. Wenn Jane dann John heiratet und seinen Namen annimmt, muss sich ihre Benutzer-ID in "jsmith2" ändern.

Sie können also festlegen, dass das erste Zeichen in einem Kennwort ein Symbol sein muss oder dass das Kennwort ein Symbol enthalten muss.

Wenn Benutzer-IDs auf 8 Zeichen gekürzt werden, müssen Kennwörter möglicherweise mindestens 9 Zeichen enthalten.

Sie können das kartesische Produkt einer Liste mit Nachnamen und einer Liste mit Vornamen verwenden und diese als schwarze Liste für Kennwörter verwenden. Wenn ein Mitarbeiter einen Namen hat, der nicht auf Ihrer Liste steht, fügen Sie ihn hinzu. Wenn Benutzer Kennwörter ändern, wird sich das Problem von selbst beheben.

4
emory

Dies ist keine Antwort, ich erwähne es nur, damit die Leute tu das nicht.

Sie könnten entscheiden, dass es sinnvoll wäre, zusätzlich zum regulären Hash ihres Kennworts, bei dem zwischen Groß- und Kleinschreibung unterschieden wird, einen Hash ihres Kennworts zu speichern, der in Kleinbuchstaben konvertiert wurde.

Dies würde Ihr Problem sicherlich lösen - Sie schreiben den Benutzernamen, in den Sie wechseln, nur in Kleinbuchstaben und vergleichen ihn mit diesem gespeicherten Hash des Passworts in Kleinbuchstaben.

Der offensichtliche Nachteil ist, dass dies den Zweck eines gehashten Passworts teilweise zunichte macht: Angriffe auf Ihre Passwortliste viel schwieriger zu machen. Ein Angreifer, der Zugriff auf Ihre Hash-Passwortlisten erhält, kann den weitaus schwächeren (2 ^ n-mal schwächeren) Kleinbuchstaben-Hash anstelle des Groß- und Kleinschreibung-Hash angreifen.

Die anderen genannten Optionen (zum Zeitpunkt der Änderung nach dem Passwort fragen; alle Fallpermutationen ausprobieren, wenn ein Administrator es ändert, idealerweise zuerst in der wahrscheinlichsten Reihenfolge) scheinen weitaus bessere Wetten zu sein.

2
Dewi Morgan

Einige gute Antworten bereits, aber hier ist eine alternative Möglichkeit, dieses Problem anzugehen. Anstatt zu versuchen, den neuen Benutzernamen mit dem vorhandenen Kennwort zu vergleichen, können Sie einfach eine Kennwortänderung erzwingen, wenn ein Benutzer seinen Benutzernamen ändert.

Natürlich möchten Sie Benutzer warnen, dass das Ändern des Benutzernamens das Ändern des Kennworts erfordert, aber Sie können dann problemlos den bereits vorhandenen Prozess verwenden, um neue Kennwörter mit Benutzernamen zu vergleichen.

2
YLearn

Die einzige Möglichkeit, Benutzer daran zu hindern, dumme Passwörter auszuwählen, besteht darin, Richtlinien zur Generierung von Passwörtern zu erzwingen (im Gegensatz zu dem leider üblichen Passwort Format Richtlinien).

Wenn Sie nicht so viel Autorität über Ihre Benutzer haben (die meisten Websites nicht), sollten Sie sie zumindest anweisen, ihre Passwörter mit einem Passwortmanager zu generieren (und ihr Hauptpasswort mit Würfel zu generieren =), und Sie können es möglicherweise schwierig machen, diese Richtlinie zu missachten:

Eine Möglichkeit, dies zu tun, besteht darin, dass Ihr Kennwortfeld keine Tastatureingaben akzeptiert, sondern nur eingefügte Daten oder maschinentypisierte Daten (ich empfehle, die Geschwindigkeit zu überprüfen, mit der Zeichen eingegeben werden). Dann können Sie das Feld, in dem die Kennwortrichtlinie erläutert wird, rot umreißen lassen oder etwas, um die Aufmerksamkeit darauf zu lenken.

0
NH.

Die sinnvollste Lösung wurde bereits erwähnt und akzeptiert, nämlich das Ändern des Kennworts bei der Änderung des Benutzernamens, da Sie dies sowieso tun sollten. Eine Alternative besteht darin, auch den Hash des Passworts in Kleinbuchstaben (mit einem anderen Salt?) Zu speichern und den Benutzernamen in Kleinbuchstaben damit zu vergleichen.

0
Omar Kooheji