パスワードの正規表現の考え方

正規表現

目次

Webサイトにおいて、パスワードをユーザに設定してもらう際、その入力内容がパスワードとして妥当かどうかを正規表現を用いて検証します。

パスワードポリシー

パスワードに使用できる文字種類、文字数、同一パスワードの使いまわし回数などの条件のことをパスワードポリシーといいます。

パスワードポリシーはWebサイトごと、システムごとに設計者が作成します。

入力文字種の制限

以下の正規表現は半角英大文字、英小文字、数字、記号のみの使用のみを定めたものです。

^[a-zA-Z0-9!"#$%&;''()\-^@[;:],./\|`{+*}<>?_]+$

しかし、このままでは1文字以上の入力であれば全ての入力がOKになってしまいます。

文字数制限

そこで文字数制限を行い、入力文字数の下限と上限を設定します。

^[a-zA-Z0-9!"#$%&''()\-^@[;:],./\|`{+*}<>?_]{6,20}$

「+」(1回以上の繰り返し)の代わりに「{6,20}」を使用しました。

これは6回以上20回以下の繰り返しという意味です。

これで1文字だけ入力したり、無制限に文字を入力された場合、エラーとすることができます。

しかしこのままでは、「英字だけ」「数字だけ」「記号だけ」の入力で下限と上限を満たせばOKになってしまいます。

肯定先読み

そこで、「英大文字を最低1回使用する」という条件を付け加えます。

「最低1回使用する」という条件を表すために、肯定先読みを使用します。

^(?=.*[A-Z])[a-zA-Z0-9!"#$%&''()\-^@[;:],./\|`{+*}<>?_]{6,20}$

「(?=.*[A-Z])」の箇所が肯定先読みです。

「(?=)」が肯定先読みの目印となり、今から肯定先読みを始めるよという意味になります。
そして、「.*[A-Z]」は通常の正規表現で、 英大文字を含む文字列という意味です。

※「.」はなんでもいいから1文字の意味、「*」は直前の文字の0回以上の繰り返しという意味です。
つまり、なんでもいいから0文字以上という意味になります。
その後に文字クラス「[A-Z]」が続くことで、英大文字を含む文字列という意味になります。

肯定先読みで、「(?=.*[A-Z])」と記述すると、ここから先の文字で英大文字が登場するという意味になります。

肯定先読み自体は「^」(行頭)や「$」(行末)と同じく位置にマッチします
つまり、「^(肯定先読み)」とすることで、英大文字が登場する行の行頭という意味になります。

そして、先ほどの「^(?=.[A-Z])[a-zA-Z0-9!”#$%&”()-^@[;:],./|`{+}<>?_]{6,20}$」の厳密な意味は、
英大文字が登場する行の行頭の後ろに、英大文字、英小文字、数字、記号のいずれかが6~20文字続く

という意味になります。

複数条件

肯定先読みを複数用いることでAND条件を表すことができます。

以下は、英大文字が最低1回、英小文字が最低1回、半角数字が最低1回、記号が最低1回登場する6~20文字という意味になります。

^(?=.*[A-Z])(?=.*[0-9])(?=.*[a-z])(?=.*[!"#$%&''()\-^@[;:],./\|`{+*}<>?_])[a-zA-Z0-9!"#$%&''()\-^@[;:],./\|`{+*}<>?_]{6,20}$

2回以上登場する条件

今までの条件でパスワードの正規表現として十分機能しますが、さらに厳しい条件をつけることもできます。

以下は、今までの条件に加え、数字は2回以上登場しなければならないという条件を加えた正規表現です。

^(?=.*[A-Z])(?=.*[0-9].*[0-9])(?=.*[a-z])(?=.*[!"#$%&''()\-^@[;:],./\|`{+*}<>?_])[a-zA-Z0-9!"#$%&''()\-^@[;:],./\|`{+*}<>?_]{6,20}$

数字の肯定先読みの箇所を「(?=.*[0-9] .*[0-9] )」のように、 「.*[0-9]」の部分を2回繰り返しました。

これにより、数字が2回登場する必要があります。

まとめ

正規表現を用いることで、パスワードの検証を少ないソースコードで行うことができます。

今回お伝えした「肯定先読み」を用いることで、特定の文字を含まなければならないという条件を付け加えることができます。

正規表現についての別記事についてもご覧ください!

★検索
パスワードの正規表現の考え方
「~を含まない行」を検索する方法
「~を含む行」を検索する方法
「~で終わる」を検索する方法
「~で始まる」を検索する方法
正規表現繰り返しの考え方

最短一致検索を行う方法
否定の文字クラス
「または」検索を行う方法

環境による「\d」の動作の違いについて検証

★置換
正規表現置換の考え方
大文字⇔小文字変換を行う方法
キャメルケース⇔スネークケース変換を行う方法
CSVを囲みなし⇒囲みありに変換する方法

CSVファイルの特定のカンマ以降を削除する方法
CSVファイルの必要な箇所だけ残す方法
数字3ケタおきにカンマを挿入する方法
正規表現置換で不要な行を削除し、必要な行だけ残す方法
数字を0埋めする方法
0埋めされた数字を0埋めなしに変換する方法
ファイル名から、拡張子のみを抽出する方法
Javaで正規表現置換を行う方法

また、Udemyという動画教育プラットフォームで動画解説を行っております。
動きを確認しながら丁寧に学習したいという方は、ぜひご覧ください!

正規表現入門 作業効率アップに役立つ38個の方法

コメント

タイトルとURLをコピーしました