Pythonでは乱数を扱うために random
モジュールをよく使いますが、セキュリティが重要な場面では secrets
モジュールを使うのが推奨されています。この記事では、secrets
を使って安全なパスワードやトークンを生成する方法を学んだ内容をまとめておきます。
secretsモジュールとは?
secrets
はPythonに標準で備わっているモジュールで、**暗号学的に安全な乱数(予測されにくい乱数)**を生成するための機能が用意されています。
Webアプリなどで扱うパスワード生成やセキュアなトークン作成など、予測されると困るような値を扱う際に使います。
トークンって何?
トークンとは、一時的な認証や識別に使う「使い捨ての鍵」のようなものです。ログイン状態の管理や、パスワード再設定リンク、APIのアクセス制御などに使われます。
たとえば「本人しか知らないトークン」がURLに含まれていれば、その人だけが特定の操作をできるようになります。トークンは一般に、次のような特徴があります:
- ランダムで長い文字列
- 一意(ユニーク)で、推測しにくい
- 有効期限つき、または一度しか使えない
まとめると、トークンは「一時的なキー」のようなものです。
ランダムなパスワードの生成
ランダムな英数字のパスワードを作る場合、secrets.choice()
を使うことで、文字列から1文字ずつ安全に選び出すことができます。
import secrets
import string
# 英大文字+英小文字+数字を使った文字セットを定義
alphabet = string.ascii_letters + string.digits
# ランダムなパスワードを生成(12文字)
password = ''.join(secrets.choice(alphabet) for _ in range(12))
print(password)
実行例:
v7Kz1A3qY0mP
このように、毎回異なる安全な文字列が出力されます。
トークンの生成方法(16進数形式)
ログイン時のトークンや認証に使われる値として、ランダムな16進数のトークンを生成したい場合は secrets.token_hex()
を使います。
import secrets
# 16バイト(=32文字)の16進数トークンを生成
token = secrets.token_hex(16)
print(token)
実行例:
9f74a6d52c234e2b1dbf3aa70b4a99cc
バイト数を変えることでトークンの長さも調整できます。
トークンの生成方法(URL安全形式)
トークンをURLに埋め込む場合には、secrets.token_urlsafe()
を使うのが便利です。
import secrets
# 16バイト相当のURLセーフなトークンを生成
url_token = secrets.token_urlsafe(16)
print(url_token)
実行例:
p8zDs0fJZxwBI95QYINaFw
トークンをURLに埋め込むとは?
たとえば次のようなURLをメールで送ることがあります:
https://example.com/reset-password?token=p8zDs0fJZxwBI95QYINaFw
このように、URLのパラメータ(?token=...
)としてトークンを含めることで、
「そのリンクをクリックした人」だけにパスワード再設定などの操作を許すことができます。
この方法は、次のような特徴を持っています:
- 本人確認ができる(メールを受け取った人にだけ操作を許す)
- 一度きり/時間制限つきにしておくことでセキュリティを保つ
- URLに埋め込んで使えるよう、安全な文字だけで構成されたトークンを使う必要がある
→ そのためにtoken_urlsafe()
が便利です
おわりに
今回は secrets
モジュールを使って、セキュリティ的に安全なパスワードやトークンを生成する方法をまとめました。
普段の学習で random
を使いがちですが、セキュリティが関わる処理では必ず secrets
を使うべきだということを理解しました。
あとで見返して復習できるように、実行例や使い方も含めて整理しました。