Vorsicht, freilaufende RegEx – Passwort-Prüfung mit regulären Ausdrücken

RegEx zur Kennwort-Validierung

Heute mal wieder nach langer Zeit ein Artikel, der mit meinem „Brot und Butter“-Job zu tun hat.

Hintergrund

In der Firma muss eine Kennwort-Richtlinie umgesetzt werden, die verwendeten Passwörter müssen also künftig bestimmten Regeln entsprechen.

Als Verzeichnisdienst und Authentifizierungsserver für die meisten Anwendungen im Entwicklungsumfeld benutzen wir Atlassian Crowd, wobei aber auch dabei ein Großteil der Benutzer über das im Hintergrund verwendete Microsoft Active Directory (AD) authentifiziert wird.

Für die sich auf diesem Weg anmeldenden Benutzer wird die Umsetzung der Passwort-Richtlinie schon im AD erzwungen, so dass Handlungsbedarf nur für Benutzer besteht, die lokal in Atlassian Crowd verwaltet werden, z.B. Testuser, technische Nutzerkennungen für bestimmte Dienste sowie externe Mitarbeiter, die nur kurz im Haus sind, z.B. um für einige Tage Tests zu unterstützen.

Atlassian Crowd erlaubt es, vom Benutzer gewählte Kennwörter über reguläre Ausdrücke (regex, regexp) zu prüfen, so dass die Einhaltung gewisser Regeln bei der Passwort-Auswahl gesichert werden kann.

Die konkrete Anforderung

Laut unserer Kennwort-Richtlinie müssen Kennworte für normale Benutzer mindestens 12 Stellen haben und jeweils mindestens ein Zeichen aus folgenden Zeichenklassen enthalten:

  • Buchstabe in Großschrift
  • Buchstabe in Kleinschrift
  • Ziffer
  • Sonderzeichen

(Über Sinn und Unsinn einer solchen Kennwort-Richtlinie müssen wir hier nicht diskutieren, die Anforderung kam in dieser Form nicht von uns ;-))

Umsetzung

Die Umsetzung per regulärem Ausdruck ist eigentlich nicht sehr kompliziert.

Dazu verwendet man die sogenannten look-around assertions, die es erlauben, kontextsensitive Bedingungen zu formulieren, ohne den Kontext selbst zu matchen, konkret verwenden wir die sogenannte positive look-ahead assertion, die die Form WertA(?=WertB) hat, was bedeutet, dass WertB dem WertA folgen muss, um einen Match zu liefern.
Für die Zeichenklasse der Ziffern würde man also einen solchen Ausdruck formulieren:

(?=.*\d)

Letztlich muss man dann nur die o.g. Zeichenklassen miteinander als kook-ahead assertions kombinieren und dann noch die Länge von mindestens 12 Zeichen erzwingen, was dann zu folgendem regulären Ausdruck (regex) führt, der direkt in Atlassian Crowd benutzt werden kann (, aus optischen Gründen hier auf mehrere Zeilen verteilt):

(

(?=.*\d)
(?=.*[a-z])
(?=.*[A-Z])
(?=.*[^\w\s])
.{12,}

)

Wie man sieht, habe ich es mir für die Sonderzeichen einfach gemacht und nutze dort die Möglichkeit der Negation, fordere also ein Zeichen, dass NICHT in der Zeichenklasse „word charakter“ (\w) ist und auch kein Leerzeichen (\s). Ob diese Lösung immer so trägt, oder Atlassian Crowd mit dem ein oder anderen dadurch möglichen Sonderzeichen vielleicht ins Straucheln kommt, wird die Zeit zeigen…

Buchtipp

Wer sich für das Arbeiten mit regulären Audrücken interessiert und tiefer in die Materie einsteigen möchte (oder dies aus beruflichen Gründen sogar tun muss), dem möchte ich noch den ultimativen Buchtipp zum Thema mit auf dem geben:

„Reguläre Ausdrücke“ von Jeffrey E.F. Friedl aus dem O’Reilly-Programm (*)

Das Buch ist wirklich die ultimative Bibel mit ALLEM notwendigen Wissen (samt Beispielen) zum Thema RegEx.

Consent Management Platform von Real Cookie Banner