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 Kennwö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. Hier gibt es keine Probleme, die die Anforderung 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 (erneut ignorieren) case) um zu sehen, ob es passt. 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 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 - könnte mich später erfolgreich mit einem übereinstimmenden Benutzernamen und Passwort von "pwdrsch1" authentifizieren.
Wir könnten den Benutzernamen vor dem Hashing in Kleinbuchstaben zwingen und ihn 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. Später kann ich mich jedoch erfolgreich mit einem übereinstimmenden Benutzernamen und Kennwort von "PwdRsch1" authentifizieren.
Welche vernünftigen Optionen habe ich, um das Risiko zu verringern, dass ein Kennwort mit einem Benutzernamen übereinstimmt, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird?