Pythonのsecretsモジュールで安全な乱数とトークンを生成する方法
暗号学的に安全な乱数を生成したい場合は、Python標準ライブラリのsecretsモジュールを利用します。このモジュールは、セキュリティ強度の高いパスワードやアカウント認証用のトークンなど、機密性の高いデータを作成する際に特に有効です。
一般的なrandomモジュールは予測可能な擬似乱数を返すため、認証用途には適していません。その点、secretsモジュールはOSが提供する高品質な乱数源(CSPRNG)にアクセスします。
secretsモジュールのクラスや関数を使用するには、まずコード内でインポートします。
import secrets
乱数の生成
secretsモジュールは、オペレーティングシステムが提供する安全な乱数源へアクセスするために使用されます。乱数に関連する主なクラスと関数は以下の通りです。
クラス:secrets.SystemRandom
OSが提供する最高品質の乱数源を利用して乱数を生成するためのクラスです。
メソッド:secrets.choice(sequence)
空でないシーケンス(リストや文字列など)から要素をランダムに1つ選択して返します。
メソッド:secrets.randbelow(n)
0以上n未満(n自体は含まない)の範囲から整数を1つランダムに選んで返します。
メソッド:secrets.randbits(k)
ランダムなkビットを持つ整数を生成して返します。
トークンの生成
secretsモジュールは、安全なトークンの生成にも活用できます。この種のトークンは、パスワードリセット用の一時キーや複雑なURLの生成などに便利です。
トークン生成に関連する主なメソッドは以下の通りです。
メソッド:secrets.token_bytes([nbytes=None])
安全なトークン生成用として、nbytesバイトのランダムなバイト列を返します。nbytesが指定されない場合やNoneの場合は、デフォルト値(32バイト)が使用されます。
メソッド:secrets.token_hex([nbytes=None])
16進数形式のランダムなテキスト文字列を返します。返される文字列はnbytesバイトのランダムデータに対応し、各バイトは2桁の16進数字に変換されるため、文字列の長さはnbytes×2文字になります。nbytesを省略した場合もデフォルト値(32バイト)が適用されます。
メソッド:secrets.token_urlsafe([nbytes=None])
URLセーフなランダムなテキスト文字列を返します。テキストはBase64エンコードされており、平均して1バイトあたり約1.3文字が出力されます。
サンプルコード
import secrets
my_sequence = ['K','?','D',':','o','5','t','l','Y','0']
rand_pass = ''
for i in range(15):
rand_char = secrets.choice(my_sequence)
rand_pass += rand_char
print("Random Password is: " + rand_pass)
my_tok1 = secrets.token_hex(10) #長さ10のHEXトークンを生成
my_tok2 = secrets.token_hex(5) #長さ5のHEXトークンを生成
print("First Token: " + my_tok1)
print("Second Token: " + my_tok2)
実行結果
Random Password is: YK0l:YD??lKKY?o First Token: f3e68646dcf1082e1038 Second Token: e4ae3c2384
このように、secretsモジュールを使えば予測困難な安全な乱数やトークンを簡単に生成できます。パスワードやセッショントークンなど、セキュリティが求められる場面では、randomモジュールではなく必ずsecretsモジュールを使用しましょう。
-
Pythonで素数を生成する方法をわかりやすく解説
素数とは何か? 素数とは、1とその数自身以外の正の整数では割り切れない数のことです。たとえば、2、3、5、7、11などが素数に該当します。なお、1は約数を1つしか持たないため、素数には含まれない点に注意しましょう。 Pythonで素数を判定する基本的な考え方 Pythonでは、剰余演算子「%」を使うことで、ある数が別の数で割り切れるかどうかを簡単に調べられます。x % y の結果が0であれば、xはyで割り切れることを意味します。 1から100までの範囲で素数を求める場合、各数値(仮にxとします)について、2からx-1までのすべての数で順番に割り切れるかを確認する必要があります。この処理は、二
-
Pythonで乱数を生成する方法を徹底解説!randomモジュールの基本と使い方
Pythonの標準ライブラリには、乱数を生成するための機能がまとめられた random モジュールが用意されています。このモジュールを利用することで、浮動小数点数や整数の乱数、シーケンスからのランダムな要素の取得などを簡単に実現できます。ここでは、よく使われる主要な関数をサンプルコードとともに紹介します。random():0以上1未満の浮動小数点数を生成もっとも基本的な関数が random() です。この関数は、0以上1未満の範囲のランダムな浮動小数点数を返します。>>> import random>>> random.random()0.520470277