Regex - Passwort-Validierung

roderick

Grünschnabel
Hi,

ich entwickle gerade ein System in Java um Passwörter auf verschiedene Dinge, wie Struktur, Blacklist, History, usw. zu überprüfen. Dabei muss ich einige Strukturregeln in Regulären Ausdrücken aufstellen.

Die Regex müssen immer matchen, damit kein Fehler kommt.
Code:
if (!matcher.find()) {
    fehler ausgeben
}
(Dies darf nicht verändert werden)

Ich verwende Java 1.5 mit java.util.regex.

Nun zu meinem eigentlichen Problem:
Ich möchte die minimal und maximal erlaubte Anzahl von beliebigen Zeichen aus einer bestimmten Zeichenklasse festlegen. (Ob es sicherheitstechnisch Sinn macht, spielt keine Rolle.)
Beispiel: Das Passwort muss zwischen 2 und 5 Zahlen enthalten.
D.h. der Regex darf nur matchen, wenn die Anzahl der enthaltenen Zahlen nicht kleiner als 2 und nicht größer als 5 ist. Das "nicht größer" ist mein Hauptproblem.

Code:
(.*[0-9].*){2,5}
war mein letzter Versuch. Meine Denkweise ist wahrscheinlicht total falsch, wieso es so nicht funktioniert, verstehe ich. Ich hab auch schon Versuche mit lookarounds gemacht, war dabei aber auch nicht viel erfolgreicher.

Ein anderes Problem bekomme ich, wenn ich die minimale und maximale Anzahl von beliebigen Zeichen einer Zeichenklasse in einer Reihe festlegen will.
Also z.B. minimal 1 und maximal 4 aus [a-z].
Mein Regex dazu:
Code:
[^a-z]*[a-z]{2,4}[^a-z]*
Ein Passwort wie "34erf43egergsegsre" kommt durch, weil das erste schon matcht. Ich muss irgendwie das gesammte Passwort betrachten können.

Ich hab jetzt schon einige Freunde/Kollegen um Hilfe gebeten und keiner konnte mir bisher richtig helfen, ihr seid meine letzte Hoffnung ;)

Viele Grüße
roderick
 

Flex

(aka Felix Jacobi)
Beim ersten könnte das hier deine Erwartungen erfüllen:

Code:
^(.{2,5})$

Beim zweiten sind dann leider auch meine RegExp Fähigkeiten überfragt.
 

Gumbo

Erfahrenes Mitglied
Reguläre Ausdrücke eignen sich dafür nicht direkt. Du kannst aber mit regulären Ausdrücken alle Nicht-Zahlenzeichen entfernen und die Länge dieser Zeichenkette prüfen:
Code:
int countNumbers = string.replaceAll("/[^\d]/", "").length;
 

roderick

Grünschnabel
Danke für eure schnelle Antwort!

Leider hilft mir das auch nicht viel weiter. Den Regex von Felix verwende ich bereits (bis auf die runden Klammern), jedoch um die Gesamtlänge des Passworts festzulegen.

Gumbos Vorschlag wäre in einem anderen Kontext bestimmt eine gute Lösung. Meine Anforderung verlangen es aber, dass alles komplett über die Regex läuft, so dass diese in einer Konfigurationsdatei abgelegt werden kann und damit einfach veränderbar ist, ohne das System neu compilen oder neu starten zu müssen.

Das einzige was ich machen kann, ist die Regeln auf viele kleine Regex zu verteilen.
 

roderick

Grünschnabel
Für mein erstes Problem habe ich jetzt eine Lösung von einem Freund bekommen:
Code:
^([^0-9]*[0-9]){2,5}[^0-9]*$
(Das Passwort muss 2 bis 5 Zahlen enthalten, damit es in Ordnung ist.)
 

roderick

Grünschnabel
Die Lösung für das zweite Problem (die minimale Anzahl wurde rausgelassen, wird doch nicht benötigt):
Code:
^[a-z]{0,3}([^a-z]+[a-z]{0,3})*[^a-z]*$
(Im Passwort dürfen Folgen von Kleinbuchstaben maxmimal 3 Stellen lang sein)