Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで安全な乱数とパスワードを生成する方法:secretsモジュール徹底解説

本記事では、パスワードとしてそのまま活用できる安全な乱数をPythonで生成する方法を解説します。乱数に英字や記号などの文字を組み合わせることで、より強固なパスワードを作成することも可能です。

secretsモジュールを使った基本的なパスワード生成

標準ライブラリのsecretsモジュールには、候補となる文字集合からランダムに1つを選択するchoice()関数が用意されています。この関数をforループとrange()関数と組み合わせることで、任意の長さのパスワードを簡単に生成できます。

コード例

import secrets
import string

allowed_chars = string.ascii_letters + string.digits + string.printable
pswd = ''.join(secrets.choice(allowed_chars) for i in range(8))
print("生成されたパスワード:\n", pswd)

実行結果

生成されたパスワード:
$pB7WY

文字種の条件を満たすパスワードの生成

セキュリティポリシーによっては、「小文字・大文字・数字を必ず含める」といった条件が求められることがあります。whileループと条件判定を組み合わせれば、こうした要件を満たすまで自動的に再生成させることができます。ここでも引き続きsecretsモジュールを使用します。

コード例

import secrets
import string

allowed_chars = string.ascii_letters + string.digits + string.printable
while True:
    pswd = ''.join(secrets.choice(allowed_chars) for i in range(8))
    if (any(c.islower() for c in pswd)
            and any(c.isupper() for c in pswd)
            and sum(c.isdigit() for c in pswd) >= 3):
        print("生成されたパスワード:\n", pswd)
        break

実行結果

生成されたパスワード:
p7$7nS2w

この例では、8文字のパスワードに対して「小文字を1つ以上含む」「大文字を1つ以上含む」「数字を3つ以上含む」という3つの条件をすべて満たした場合のみ、ループを抜けて結果を出力します。

URL向けのランダムトークン生成

Webアプリケーションでは、パスワードリセット用URLなどにランダムなトークンを埋め込みたい場面が多くあります。secretsモジュールには、用途に応じて使い分けられる以下の3種類のトークン生成関数が用意されています。

  • token_bytes(): ランダムなバイト列を生成
  • token_hex(): ランダムな16進数形式のテキスト文字列を生成
  • token_urlsafe(): URLとして安全なランダムテキスト文字列を生成

コード例

import secrets

# ランダムなバイト列
tkn1 = secrets.token_bytes(8)
# ランダムな16進数テキスト文字列
tkn2 = secrets.token_hex(8)
# URLセーフなランダムテキスト文字列
url = 'https://thename.com/reset=' + secrets.token_urlsafe()

print("ランダムなバイト列:\n", tkn1)
print("ランダムな16進数テキスト文字列:\n", tkn2)
print("URLセーフトークン付き文字列:\n", url)

実行結果

ランダムなバイト列:
b'\x0b-\xb2\x13\xb0Z#\x81'
ランダムな16進数テキスト文字列:
d94da5763fce71a3
URLセーフトークン付き文字列:
https://thename.com/reset=Rd8eVookY54Q7aTipZfdmz-HS62rHmRjSAXumZdNITo

まとめ

パスワードやトークンの生成には、予測可能性のあるrandomモジュールではなく、暗号学的に安全なsecretsモジュールを使用することが推奨されます。文字種の条件指定からURLセーフなトークン生成まで、目的に応じた関数を使い分けることで、堅牢な認証情報を簡単に作成できます。

  1. Pythonで1から20までの乱数を生成し、リストに追加するプログラム

    指定した範囲内で乱数を生成し、それらをリストに追加したい場合、乱数を生成して空のリストに append メソッドで順次追加していく関数を定義すると便利です。以下に具体的な実装例を示します。サンプルコードimport random def random_gen(beg, end, my_num): my_result = [] for j in range(my_num): my_result.append(random.randint(beg, end)) return my_result my_num = 19 beg = 1 end = 20

  2. PythonのpyqrcodeモジュールでQRコードを生成する方法

    QRコードは、白い背景の上に黒い四角形を格子状に配置した2次元コードで、カメラなどの画像読み取り装置によって読み取ることができます。商業用途での在庫追跡や決済、ウェブサイトへのログインなど、スマートフォンユーザー向けのさまざまなアプリケーションで広く利用されています。Pythonではpyqrcodeモジュールを使うことで、簡単にQRコードを生成できます。QRコードには、データを効率的に格納するための4つの標準エンコードモード(数値モード、英数字モード、バイト/バイナリモード、漢字モード)が用意されています。英数字のQRコードを生成するpyqrcodeモジュールには、QRコードを生成するためのc