Pythonランダムな文字列のパスワードを生成する

この記事では、Pythonでランダムな文字列でパスワードを生成する方について紹介します。

この記事の目的

  • 指定した文字数のパスワードを生成する。
  • 大文字・小文字の混ざるランダムなパスワードを生成する。
  • 文字列の中で繰り返しのないユニークな文字列のパスワードを生成する
  • 数字とアルファベットのランダムなパスワードを生成する。
  • 特殊文字・数字・アルファベットのランダムなパスワードを生成する。
  • シークレットモジュールを使用して、セキュリティに敏感なアプリケーション用の安全なランダム文字列を生成する。

指定した文字数のランダムな文字列のパスワードを生成する。

ランダムな文字列のパスワードを生成するために、2つのモジュールを使用する必要があります。

string module

stringモジュールには、すべての場合のASCII文字を含むさまざまな文字列定数が含まれています。文字列モジュールには、小文字、大文字、数字、および特殊文字用の個別の定数が含まれています。

random module

randomモジュールは、Pythonでランダムな処理が必要な場合に活躍する標準モジュールです。

8桁の文字数のランダムな文字列を生成する手順を見てみましょう。

文字列定数string.ascii_lowercaseを使用して、すべての小文字を取得します。つまり、「abcdefghijklmnopqrstuvwxyz」
forループを8回実行し、random.choice()を使用して文字列定数から1文字を選択します。各反復の最後に、結合関数を使用して文字列変数に追加します。

注:random.choice()関数は、任意のシーケンスから単一の要素を選択するために使用されます。

処理結果

Random string of length 8 is: mweeusat
Random string of length 8 is: mulguddx
Random string of length 6 is: gbangh

注:上記のランダムな文字列には、すべて小文字が含まれています。大文字のみが必要な場合は、string.ascii_lowercaseの代わりにstring.ascii_uppercaseを使用してください。

大文字・小文字の混ざるランダムなパスワードを生成する。

小文字と大文字の組み合わせでランダムな文字列を生成する場合は、string.ascii_letters定数を使用します。この定数には、すべての小文字と大文字が含まれます。
forループをn回実行して、random.choice()関数を使用して文字列定数から1つの文字を選択し、それを文字列変数に追加します。
コードを見てみましょう。

処理結果

Random string is: wYpZsAbZ
Random string is: djDXlkqF

特定の文字のみのランダムな文字列を生成する

特定の文字のみのランダムな文字列を生成するコードは次のようになります。

処理結果

Random string is: aidbg
Random string is: giich

注:random.choice()メソッドは文字を繰り返すことができます。文字を繰り返したくない場合は、random.sample()関数を使用します。次の例を見てみてください。

文字を繰り返さずにランダムな文字列を生成する

前に述べたように、random.choice関数は同じ文字を再び選択する可能性があります。ランダムな文字列で文字を繰り返したくない場合は、random.sample()関数を使用します。

処理結果

Random String is: fpxudstg
Random String is: qgcxrhbt

read more:random.sample()
警告:出力でわかるように、すべての文字は一意です。 random.sample()が文字を繰り返すことはありません。ランダムな文字列で文字や数字を繰り返したくない場合は、random.sample()を使用しますが、文字や数字の繰り返しは許可されていないため、組み合わせの可能性が低くなるため、安全性は低くなります。

文字と数字のランダムな英数字の文字列を生成する。

多くの場合、文字と数字の両方を含むランダムな文字列を作成する必要があります。たとえば、ab23cd、jkml98、87thkiのようなランダムな文字列が必要です。 string.ascii_letters定数とstring.digits定数を使用して、ランダムな文字列の文字と数字の組み合わせを取得できます。
Pythonで文字と数字を含むランダムな文字列を生成する例を見てみましょう。この例では、A〜Zの文字、a〜z、および0〜9の数字を組み合わせたランダムな文字列を作成しています。

処理結果

Random alphanumeric String is: vZkOkL97
Random alphanumeric String is: xkD3POL4

文字と数字の文字数が固定されたランダムな英数字の文字列を生成する。

たとえば、5文字と3つの数字を含むランダムな英数字の文字列を作成したいとします。

処理結果

First random alphanumeric string is: v809mCxH
Second random alphanumeric string is: mF6m1TRk

Read More: random.shuffle()
リスト(配列)の要素をシャッフル(ランダムに並べ替え)したい場合に使用します。

特殊文字、文字、数字を含むランダムなパスワード文字列を生成する。

文字、数字、特殊記号を含むパスワードは、強力なパスワードと見なされます。
たとえば、次のようなランダムなパスワードを生成するとします。

ab23cd#$
jk%m&l98
87t @ h * ki

最初のアプローチ:
次の2つの方法を使用して、特殊文字を含むランダムな文字列パスワードを生成できます。
3つの文字列定数、つまりstring.ascii_letters、string.digits、string.punctuationをrandom.choice関数とともに使用します。
string.printableおよびrandom.choice関数を使用します。ここで、string.printableには、すべての小文字と大文字、数字、および特殊文字が含まれています。
例を見てみましょう。この例では、string.ascii_letters、string.digits、string.punctuationをrandom.choice関数とともに使用しています。

処理結果

Random string password is: “C:!|]@|sh
Random string password is: ‘Q^s2q!t-N

2つ目の方法

少なくとも1つの小文字、1つの大文字、1つの数字、および1つの特殊文字を含むランダムパスワードを生成します。

処理結果

First Random Password is 2!pHrm*(^5
Second Random Password is !.J_4#)yrf

安全なランダム文字列とパスワードを生成する。

全ての今までの例は暗号的に安全ではありません。暗号的に安全なランダムジェネレーターは、同期方法を使用してランダムデータを生成し、2つのプロセスが同じデータを同時に取得できないようにします。

3.6未満のPythonバージョンを使用していて、暗号的に安全なランダム文字列を生成する場合は、random.choice()の代わりにrrandom.SystemRandom().choice()関数を使用します。 Pythonでランダムデータを保護する方法を参照してください。

3.6より前のバージョンのPythonを使用している場合は、secretsモジュールを使用して安全なランダム文字列を生成できます。

secretsモジュールを使用して、安全なランダム文字列を生成

random.choice()の代わりに、secrets.choice()関数を使います。

処理結果

First secure random String is: PGLQbLLk
Second secure random String is: oNwmymUW

組み合わせは文字列定数とランダムモジュール関数に依存します。 Pythonでランダムな文字列を生成するために利用できる他の方法もあります。
次にその方法を紹介します。

安全なトークン文字列を生成するためのsecretsモジュール

secrets.token_hex()関数を使用して、16進形式の安全なランダムテキスト文字列を取得できます。

処理結果

Secure hexadecimal string token 25cd4dd7bedd7dfb1261e2dc1489bc2f046c70f986841d3cb3d59a9626e0d802

UUIDモジュールを使用して普遍的にユニークなセキュアランダム文字列IDを生成する

UUIDモジュールを使用して生成されたランダムな文字列は、暗号的に安全なアプリケーションに適しています。 UUIDモジュールには、これを行うためのさまざまな機能があります。この例では、uuid4()関数を使用してランダムな文字列IDを生成しています。例を見てみましょう。

処理結果

Secure unique string id 0682042d-318e-45bf-8a16-6cc763dc8806

StringGeneratorモジュールを使用して、ランダムな文字列を生成します

StringGeneratorモジュールは、標準ライブラリの一部ではありません。ただし、必要に応じて、pipを使用してインストールし、使用できます。

処理結果

random string using StringGenerator 4VX1yInC9S
random string using StringGenerator “C01N=10

最後に

Pythonでランダムな文字列を取得する方法は様々あります。
もしかしたら、これ以外のランダムな文字列を取得する方法はあるかもしれません。
その際は、コメント欄に方法を描いてください。

[参考]:Generate Random Strings and Passwords in Python