PYTHON MEBY

Pythonでsecretsを使って安全な乱数を生成 (Python 3.6以降)

この記事では、Python 3.6以降で導入されたsecretsモジュールを使用して、暗号化に適した安全な乱数を生成する方法を説明します。このモジュールは、予測可能性のある乱数生成器を使用するリスクを軽減し、セキュリティを強化します。

目次

secretsモジュールとは?

secretsモジュールは、暗号化用途に適した、より安全な乱数を生成するためのモジュールです。randomモジュールとは異なり、予測可能性を低減するアルゴリズムを使用しています。

secretsモジュールは、OSが提供する、より安全な乱数生成機能を利用しています。これにより、攻撃者による予測や操作を困難にします。

乱数の生成

最も基本的な乱数の生成方法は、secrets.randbelow()とsecrets.choice()です。

import secrets
# 10未満のランダムな整数
random_integer = secrets.randbelow(10)
print(f"10未満のランダムな整数: {random_integer}")

# リストからランダムに要素を選択
my_list = ["apple", "banana", "cherry"]
random_choice = secrets.choice(my_list)
print(f"リストからのランダムな選択: {random_choice}")

secrets.randbelow(n) は0からn-1までのランダムな整数を返し、secrets.choice(seq) はシーケンスseqからランダムに要素を選択します。

様々な乱数の生成方法

secretsモジュールは、様々な種類の乱数を生成する関数を提供しています。

import secrets
import string

# nビット長のランダムな整数
random_int_nbit = secrets.randbits(256) # 256ビットの整数
print(f"nビット長のランダムな整数: {random_int_nbit}")

# 指定された長さのランダムな文字列(英小文字)
random_string_lowercase = ''.join(secrets.choice(string.ascii_lowercase) for i in range(16))
print(f"英小文字のランダム文字列: {random_string_lowercase}")

# 指定された長さのランダムな文字列(英小文字、英大文字、数字)
random_string_alphanumeric = ''.join(secrets.choice(string.ascii_letters + string.digits) for i in range(16))
print(f"英字と数字のランダム文字列: {random_string_alphanumeric}")

# トークン生成(例:パスワード生成)
token_bytes = secrets.token_bytes(16)  # 128ビットのトークン
token_hex = secrets.token_hex(16) # 128ビットのトークン(16進数表現)
token_urlsafe = secrets.token_urlsafe(16) # 128ビットのトークン(URLセーフ)
print(f"トークン (bytes): {token_bytes}")
print(f"トークン (hex): {token_hex}")
print(f"トークン (urlsafe): {token_urlsafe}")

これらの関数は、パスワード、セッションID、一時的な認証トークンなどの生成に役立ちます。

注意点と推奨事項

secretsモジュールを使用する際の注意点と推奨事項です。

  • セキュリティを重視するアプリケーションでは、常にsecretsモジュールを使用してください。
  • randomモジュールは、暗号化用途には適していません。
  • 適切な長さの乱数を使用してください。短すぎる乱数は、容易に推測される可能性があります。
  • 生成された乱数を適切に保護してください。
  • 必要に応じて、OS固有の機能を利用することで、さらに高いセキュリティを実現できます。

関連記事