Pythonを使ってパスワードの使用可能文字チェックを作成する

Pythonを使って、パスワードの使用可能文字チェックを作成する方法を紹介します。作成するのは「パスワードの使用可能文字チェック」と「パスワードの複雑さチェック」です。

パスワードの使用可能文字チェック

今回のチェックでは、パスワード入力可能文字は「 (スペース)」〜「~」までとします。この範囲は16進数で「0x20」〜「0x7E」なので、この範囲を用いて正規表現のパターンを書きます。(wikipediaのASCII印字可能文字

パターンに16進数を使う

pythonでは\x00という形式で、正規表現のパターンに16進数を使うことができます。例えば、「A」は16進数で「0x41」なので、r'\x41'というパターンで一致させることができます。

>>> hex(ord('A'))
'0x41'  # Aは16進数で0x41で表されます。
>>> import re
>>> re.search(r'^\x41$', 'A')
<_sre.SRE_Match object; span=(0, 1), match='A'>  # マッチします。
>>> re.search(r'^\x41$', 'B')
  # マッチしません。

パスワードの使用可能文字チェックする関数を作成

16進数をパターンに使う方法を踏まえて、パスワードの使用可能文字チェックする関数を作成します。

この関数では、引数に受け取った文字列の全ての文字が、「 (スペース)」〜「~」の範囲に含まれるかをチェックしています。

パスワードの複雑さチェック

パスワードが、「数字」・「英字小文字」・「英字大文字」・「記号」の4つのカテゴリを、それぞれ最低でも1文字は含まれているかをチェックする関数を作成します。

それにあたり、まずは「数字が含まれているかをチェックする関数」・「英字小文字が含まれているかをチェックする関数」・「英字大文字が含まれているかをチェックする関数」・「記号が含まれているかをチェックする関数」を作成します。

数字・英字小文字・英字大文字が含まれているかをチェックする関数を作成

数字・英字小文字、英字大文字が含まれている関数は、それぞれ正規表現のパターン[0-9][a-z][A-Z]を使うと簡単に作成できます。

記号が含まれているかをチェックする関数を作成

まずはASCII文字の表を使って、記号の範囲を定義します。

この範囲を使って正規表現のパターンを組み立てます。

パスワードの複雑さチェックする関数を作成

_has_digit_has_lower_letter_has_upper_letter_has_markを作成したら、それらを使ってパスワードの複雑さをチェックする関数を作成します。処理の内容は、それら4つの関数のどれかでFalseが返ってきたらFalse、それ以外はTrueを返すようにします。

コード全体

今回紹介したパスワードチェックの関数全体と、そのテストケースを掲載します。(GitHubへのリンク

password_utils.py

tests.py

この記事が役に立った場合、シェアしていただけると励みになります!!