「secrets」のコラム

トップページ>「secrets」のコラム

Python "secrets" モジュール:安全な乱数を簡単に生成

Pythonで安全な乱数が必要になったことはありませんか?パスワードの生成、認証トークンの作成、あるいは暗号化キーの生成など、セキュリティが重要な場面では、予測可能な乱数は使えません。

そこで登場するのが、Pythonの secrets モジュールです。secrets モジュールは、暗号論的に安全な乱数を簡単に生成するための機能を提供します。初心者でもすぐに使いこなせるように、その基本と活用例を見ていきましょう。

なぜ "secrets" モジュールが必要なのか?

Pythonの標準ライブラリには random モジュールがあります。これは便利ですが、セキュリティを考慮した設計ではありません。random モジュールは、疑似乱数生成器(PRNG)を使用しており、生成される乱数は完全にランダムではありません。シードと呼ばれる初期値に基づいて、決定的なアルゴリズムで生成されるため、初期値が分かれば予測可能です。

これに対し、secrets モジュールは、オペレーティングシステムが提供するより安全な乱数生成機能を利用します。具体的には、Linux/macOS では /dev/urandom、Windows では CryptGenRandom などのシステムが提供する真性乱数生成器 (TRNG) を利用します。これらの生成器は、予測が極めて困難な物理現象に基づいているため、セキュリティ的に優れています。

"secrets" モジュールの基本的な使い方

secrets モジュールを使うのは非常に簡単です。

  1. インポート: まず、secrets モジュールをインポートします。

    import secrets
    
  2. 安全な乱数の生成: secrets モジュールには、いくつかの便利な関数が用意されています。

  • secrets.randbelow(n): 0からn未満のランダムな整数を返します。random.randrange(n) に似ていますが、より安全です。

    ```python import secrets

    random_number = secrets.randbelow(10) # 0から9までのランダムな整数 print(random_number) ```

  • secrets.randbits(k): kビットのランダムな整数を返します。

    ```python import secrets

    random_bits = secrets.randbits(8) # 8ビット(0から255)のランダムな整数 print(random_bits) ```

  • secrets.token_bytes([nbytes=None]): nbytesバイトのランダムなバイト列を返します。nbytesが指定されていない場合は、デフォルトで32バイトが使用されます。

    ```python import secrets

    random_bytes = secrets.token_bytes(16) # 16バイトのランダムなバイト列 print(random_bytes) ```

  • secrets.token_hex([nbytes=None]): nbytesバイトのランダムなバイト列を16進数文字列として返します。

    ```python import secrets

    random_hex = secrets.token_hex(16) # 32文字の16進数文字列(16バイト相当) print(random_hex) ```

  • secrets.token_urlsafe([nbytes=None]): nbytesバイトのランダムなバイト列をURLセーフなBase64エンコードされた文字列として返します。

    ```python import secrets

    random_urlsafe = secrets.token_urlsafe(16) # 22文字のURLセーフな文字列(16バイト相当) print(random_urlsafe) ```

実践的な例:安全なパスワード生成

secrets モジュールを使って、安全なパスワードを生成してみましょう。

import secrets
import string

def generate_password(length=16):
    """ランダムなパスワードを生成します"""

    alphabet = string.ascii_letters + string.digits + string.punctuation
    password = ''.join(secrets.choice(alphabet) for i in range(length))
    return password

# パスワードを生成して表示
password = generate_password()
print(f"生成されたパスワード: {password}")

この例では、string モジュールを使って、英字、数字、記号を含む文字セットを作成し、secrets.choice() を使って、ランダムに文字を選択し、指定された長さのパスワードを生成しています。

まとめ

secrets モジュールは、Pythonでセキュリティ的に重要な乱数を生成するための強力なツールです。パスワードの生成、APIキーの作成、セッショントークンの生成など、様々な用途で活用できます。random モジュールを使うべきか secrets モジュールを使うべきか迷ったら、セキュリティが重要な場合は secrets を選択しましょう。Pythonでより安全なアプリケーションを開発するために、ぜひ secrets モジュールを活用してください。





【mei_13のPython講座】
◯月額4,000円で質問し放題!!
◯完全オンライン
◯翌日までには必ず返信
◯挫折しない独自の学習メソッド
◯圧倒的高評価!!
◯テキストベースで時間を選ばない
詳細はこちら
興味がある方はまず質問だけでもどうぞ!




< データ型
MediaPipe >







コラム一覧

if文
for文
関数
配列
文字列
正規表現
ファイル入出力
openpyxl
Numpy
Matplotlib
Pandas
scikit-learn
seaborn
beautifulsoup
tkinter
OpenCV
pygame
メイン関数
自作ライブラリ
画像処理
機械学習
スクレイピング
データ分析
グラフ作成
API
可読性
デバッグ
例外処理
コメント
組み込み関数
flask
学び方
ビット演算
マルチスレッドプログラミング
参照渡し
pyenv
エディタ
生成AI
画像認識
Streamlit
lambda式
物理演算シミュレーション
命名規則
遺伝的アルゴリズム
関数型プログラミング
オブジェクト指向
ツリー図
Anaconda
Google Colaboratory
PyTorch
NLTK
音声処理
yt-dlp
組み込み開発
データベース操作
iclawler
PyCaret
pickle
plotly
polars
Mecab
乱数
PyInstaller
MySQL
Pip
sys.argv
データ型
secrets
MediaPipe
YOLO
ソート