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