Regulärer Ausdruck für Passwort?

3 Antworten

^(?=.*[a-z]+.*)(?=.*[A-Z]+.*)(?=.*\d+.*)(?=.*\W.*).{8,}$

Naja, ein großes Zeichen, ein kleines Zeichen, ein Sonderzeichen, eine Zahl und 8 Lang machen kein sicheres Passwort. Trotzdem habe ich mich mal daran versucht. Wie Funktioniert das?

  1. Zuerst müssen wir auf jedes Zeichen lauschen, welches existiert. Das tun wir mit einem Punkt und sagen dann, es müssen 8 Zeichen existieren. Es ist egal, welche Zeichen enthalten sind. Das kommt im nächsten Schritt
  2. Jetzt hängen wir vorweg ein paar Lookaheads. Damit sagen wir, dass nicht nur jedes Zeichen 8 Mal matchen darf, sondern bestimmte Dinge davor auch erfüllt sein müssen.
  3. Lookahead 1: .*[a-z]+.* -> Falls vorhanden irgendwelche Zeichen vorweg, egal wie viele (darf auch keins vorweg sein) und dann einen Kleinbuchstaben und dann wieder irgendwelche Zeichen oder kein Zeichen
  4. Lookahead 2: .*[A-Z]+.* -> Wie bei Lookahead 1, nur schauen wir jetzt, ob Großbuchstaben vorhanden sind. Mit dem + nach ] sagen wir übrigens, dass es einmal oder mehr vorhanden sein muss das Zeichen. 0 mal geht da nicht
  5. Lookahead 3: Wir schauen, ob eine Zahl vorhanden ist. [0-9] ist eine Zahl, aber kürzer geschrieben geht hier auch \d. \w konnten wir bei a-z nur nicht nehmen, da es \w egal ist, ob groß oder klein geschrieben.
  6. Lookahead 4: Sonderzeichen dürfen alles sein, was kein Buchstabe ist und keine Zahl ist. Also sagen wir keinen Buchstaben \W (Bezieht auch Zahlen mit ein, wodurch ein \D nicht mehr nötig ist). Wichtig ist hier groß und kleinschreibung. w bedeutet Buchstabe und W bedeutet kein Buchstabe.
  7. Mit ^ und $ außenrum sagen wir nur noch, dass es von Anfang bis Ende dieses Format haben soll

Ich hoffe meine Erklärung ist soweit verständlich 😅

PS: Mit Lookbehinds geht das auch, allerdings sind die nicht überall unterstützt:

^.{8,}(?<=.*[a-z]+.*)(?<=.*[A-Z]+.*)(?<=.*\d+.*)(?<=.*\W.*)$

BeamerBen  26.01.2022, 12:46
Naja, ein großes Zeichen, ein kleines Zeichen, ein Sonderzeichen, eine Zahl und 8 Lang machen kein sicheres Passwort

Wie Aa00000! ist kein sicheres Passwort? Verdammt, dann muss ich das ja überall ändern /s

0

Für alle Regex Themen empfehle ich die Seite https://regex101.com

Stell die passende Regex Engine ein, die Seite bietet eine gute Quick Reference und auch debugging tools, eine Erklärung welche Teile der regex auf welche Strings matchen und so weiter.

In dem Fall kann es aber gut sein, dass die bessere Lösung wäre verschiedene Regex zu machen damit du auch hints anbieten kannst welche Requirements nicht passen. Bei Regex musste auch immer ein bisschen aufpassen - oft gibts hier dann Fehler weil Leute nur [a-z] matchen usw., und da zählen dann Zeichen wie öüäあß nicht rein. So was sollte man auch beachten und testen.

Man kann das auch schon als eine Regex machen, ist jetzt auch nicht so kompliziert mit Lookaheads z.B. wie in daCyphers Antwort, lohnt aber einfach nicht immer. Und außerdem gibts oft Leute die Regex nicht so gut können, für die schreibe ich meistens im Code ein Kommentar wie die Regex ungefähr aufgebaut ist wenn man manche "fortgeschrittenen" features nutzt die vielleicht nicht jeder kennt, oder es ne lange Expression ist.

Woher ich das weiß:Berufserfahrung – Software Entwickler / Devops

BeamerBen  26.01.2022, 12:20

btw, sinnvoller als restriktive Password policies zu nutzen könnte es sein, die hibp api abzufragen ob es ein geleaktes Passwort ist.

Das deckt ein größeres Risiko ab und wird auch das nutzen von gänigen Standard Passwörtern genau so blockieren.

0

Das hier müsste dafür gehen:

^(?=.*[a-z].*)(?=.*[A-Z].*)(?=.*[0-9].*)(?=.*\W.*).{8,}$

Die vier Kriterien werden jeweils mit einem Forward-Lookup abgefragt und ganz am Ende kommt halt das .{8,} also mindestens 8 Zeichen.

Musst nur aufpassen, das die regulären Ausdrücke bei dir auf Groß-/Kleinschreibung achten. Das ist je nach Programmiersprache anders. Ansonsten kannst du auch noch (?-i) vorne dran schalten, dann wird auf jeden Fall auf Groß-/Kleinschreibung geachtet.