2016-03-21 17 views
3

複雑な要件のために入力パスワードをチェックするいくつかの正規表現があります。しかし、それは私のニーズに十分に堅牢ではありません。数字または特殊文字を含むパスワードの複雑さの正規表現

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

パスワードが最小長を満たし、両方の場合の文字を含み、数字が含まれていることを確認します。

しかし、数字や許可された特殊文字を含むように修正する必要があります。私は許可された特殊文字のリストを与えられています。

私は2つの問題があります。特殊文字を区切り、最初の条件に数字と特殊文字を一致または一致させることです。

これらの部分の正規表現の神からアドバイスをいただきたいと思います。

許さ特殊文字は以下のとおりです。@%+\/'!#$^?:.(){}[]~-_

+0

例がないと、少し不明です。 。?(?=。* [az])(?=?*) 。* [AZ])。{8,20} $ "'](http://regexstorm.net/tester?p=%5e(%3f%3d。*%5b%5cd%40%25%2b%2f (%3f%3d。*%5ba-z%5d)(%3f%5d%5e%5e% 3d。*%5bA-Z%5d)。%7b8%2c20%7d%24&i =テキスト123%2fA)。私は理解しています "と"または "または"正規表現で "。ところで、 '$'や '\ z'がなくても実際に長さを制限していませんでした。 –

+2

パスワードの最大長を制限する特別な理由はありますか?通常、これはノーノルのビットと考えられます。 – Phylogenesis

+2

この種のパスワード強度の要件は賢明ではなく、最大長の設定はばかげています(これを行う必要がある場合は、ハッシュが間違っていることが示唆されます)。 https://xkcd.com/936/およびhttps://crackstation.net/hashing-security.htmを参照してください。 –

答えて

2

私が正しくあなたの質問を理解していれば、あなたは別の特殊文字を必要とする可能性を探しています。これは、以下のように(最後の先読みを参照)行うことができます。

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

はここregex101.comに、このアプローチのためのデモを参照してください。
しかし、ドットスター(.*)は後でラインとバックトラックを表示します。たとえば、10文字のパスワードをお持ちで、4つの先読みが必要な場合は、以上が少なくとも(エンジンが逆戻りする必要があるため)以上のステップが必要です。
式を最適化するには、と正確に反対の文字()を使用して、エンジンをより早く終了させることができます。また、コメントで既に指摘したように、最大​​パスワードの長さを制限しないでください。 、最初のアプローチ、63 steps are needed

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

ながら、最適化されたバージョンのみneeds 29 steps(半分!):正規表現の言語で
が、これはに降りてくるでしょう。

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

かそこらのように、同様に括弧で\dを置く:

あなたの2番目の質問については、桁 または特殊文字を許可するには、単にそのように交替( |)を使用することができます
((?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=.*[\d!§$%&/(/)]).{8,}) 

このパスワードは、ConsideredAgoodPassw!rdC0nsideredAgoodPasswordといいます。

関連する問題