2016-03-21 20 views
3

Ich habe einige Regex, die eingehenden Passwörter für Komplexitätsanforderungen überprüfen. Aber es ist nicht robust genug für meine Bedürfnisse.Passwort Komplexität Regex mit Nummer oder Sonderzeichen

((?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,20}) 

Es stellt sicher, dass ein Passwort Mindestlänge erfüllt, enthält Zeichen von beiden Fällen und enthält eine Reihe.

Allerdings muss ich dies ändern, so dass es eine Nummer und/oder ein erlaubtes Sonderzeichen enthalten kann. Ich habe sogar eine Liste von erlaubten Sonderzeichen bekommen.

Ich habe zwei Probleme, Abgrenzung der Sonderzeichen und machen die erste Bedingung tun und/oder für die Zahl oder spezielle übereinstimmen.

Ich würde wirklich Ratschläge von einem der Regex Götter rund um diese Teile zu schätzen wissen.

Die erlaubten Sonderzeichen sind: @%+\/'!#$^?:.(){}[]~-_

+0

Ohne ein Beispiel ist es ein wenig unklar. Probieren Sie ['@^(? =. * [\ D @% +/'! # $ ^?:.() {} [\] ~ _-]) (? =. * [Az]) (? = . * [AZ]). {8,20} $ "'] (http://regexstorm.net/tester?p=%5e (% 3f% 3d. *% 5b% 5cd% 40% 25% 2b% 2f % 27!% 23% 24% 5e% 3f% 3a.()% 7b% 7d% 5b% 5c% 5d% 7e _-% 5d) (% 3f% 3d. *% 5ba-z% 5d) (% 3f% 3d. *% 5bA-Z% 5d).% 7b8% 2c20% 7d% 24 & i = Text123% 2fA). Ich verstehe "und/oder" als "oder" in Regex. BTW, ohne '$' oder '\ z' hast du die Länge nicht wirklich eingeschränkt. –

+2

Gibt es einen besonderen Grund, warum Sie die maximale Länge eines Passworts begrenzen? Normalerweise würde das als ein bisschen No-No betrachtet werden. – Phylogenesis

+2

Password Stärke Anforderungen dieser Art sind nicht klug, und die Einstellung einer maximalen Länge ist lächerlich (wenn Sie dies tun müssen, schlägt es vor, dass Sie tun Hashing falsch). Siehe https://xkcd.com/936/ und https://crackstation.net/hashing-security.htm –

Antwort

2

Wenn ich Ihre Frage richtig verstanden habe, sind Sie nach einer Möglichkeit suchen noch einen besonderen Charakter zu verlangen. Dies könnte getan werden, wie folgt (siehe den letzten Look-Ahead):

((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!§$%&/(/)]).{8,20}) 

Sehen Sie eine Demo für diesen Ansatz hier auf regex101.com.
Aber Sie können Ihren Ausdruck noch besser machen mit weiteren Genehmigungen: der Punkt-Stern (.*) bringt Sie auf den neuesten Stand und Backtracks hinterher. Wenn Sie ein Passwort von etwa 10 Zeichen haben und sicherstellen möchten, dass vier Lookaheads erfüllt werden müssen, benötigen Sie mindestens 40 Schritte (noch mehr, da die Engine zurückverfolgen muss).
Um Ihren Ausdruck zu optimieren, können Sie die genau gegenüber Ihrer erforderlichen Zeichen verwenden, wodurch die Engine schneller zum Ende kommt. Wie bereits in den Kommentaren erwähnt, beschränken Sie nicht Ihre maximale Passwortlänge.
In der Sprache der regulären Ausdrücke, dies würde kommen auf:

((?=\D*\d)(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=.*[!§$%&/(/)]).{8,}) 

Mit dem ersten Ansatz, 63 steps are needed, während die optimierte Version nur needs 29 steps (die Hälfte!). In Bezug auf Ihre zweite Frage, eine Ziffer oder ein Sonderzeichen erlaubt, Sie einfach eine Abwechslung (|) wie so verwenden:

((?:(?=\D*\d)|(?=.*[!§$%&/(/)]))(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z]).{8,}) 

Oder setzen Sie die \d in den Klammern als auch, wie so:

((?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=.*[\d!§$%&/(/)]).{8,}) 

Dies würde ConsideredAgoodPassw!rd und C0nsideredAgoodPassword ein gutes Passwort sein.