乱数生成器(RNG)とは
乱数生成器(RNG / Random Number Generator)は、予測不可能な乱数を生成する仕組みです。暗号化においては、鍵生成、IV/Nonce生成、ソルト生成など、セキュリティの根幹に関わる場面で使用されます。
乱数生成器の種類:
- TRNG(True RNG):物理的な現象(熱雑音など)を利用した真の乱数
- PRNG(Pseudo RNG):アルゴリズムに基づく疑似乱数
- CSPRNG(Cryptographically Secure PRNG):暗号学的に安全な疑似乱数
暗号学的に安全な乱数(CSPRNG)
暗号処理に使用する乱数は、以下の特性を満たす必要があります:
- 予測不可能性:過去の出力から将来の出力を予測できない
- 逆行不可能性:内部状態が漏洩しても過去の出力を復元できない
- 統計的ランダム性:各ビットの出現確率が均等
# Pythonでの安全な乱数生成
import os
import secrets
# OSのCSPRNGを直接使用
secure_random_bytes = os.urandom(32)
# secretsモジュール(Python 3.6+、推奨)
secure_token = secrets.token_bytes(32)
secure_hex = secrets.token_hex(32)
secure_urlsafe = secrets.token_urlsafe(32)
# ❌ 暗号用途に使ってはいけない
import random
# random.random()は予測可能なので暗号には不適切
AIエンジニアとしての実体験
機械学習モデルの暗号化システムを設計する際、適切な乱数生成器の選択が重要でした。特に、モデルの暗号化鍵やAPIトークンの生成では、os.urandom()またはsecretsモジュールを必ず使用しています。
# 暗号鍵の安全な生成
from cryptography.hazmat.primitives.kdf.hkdf import HKDF
from cryptography.hazmat.primitives import hashes
import secrets
def generate_encryption_key() -> bytes:
"""256ビットAES鍵を安全に生成"""
return secrets.token_bytes(32)
def generate_api_token() -> str:
"""APIトークンを安全に生成"""
return secrets.token_urlsafe(32)
# セッションIDの生成
def generate_session_id() -> str:
return secrets.token_hex(16) # 128ビット
自社サーバー運用への応用
Linuxでの乱数生成
# /dev/urandom - 非ブロッキング、通常はこちらを使用
dd if=/dev/urandom bs=32 count=1 2>/dev/null | xxd -p
# /dev/random - エントロピープールが枯渇するとブロック
# 通常の用途では/dev/urandomで十分
# エントロピー状態の確認
cat /proc/sys/kernel/random/entropy_avail
# OpenSSLでの乱数生成
openssl rand -hex 32
エントロピー源の確保
仮想環境やコンテナでは、エントロピー不足が問題になることがあります。havegedやrng-toolsを使用してエントロピープールを補充できます。
# havegedのインストール(Debian/Ubuntu)
sudo apt install haveged
sudo systemctl enable haveged
# rng-toolsのインストール(ハードウェアRNG使用時)
sudo apt install rng-tools
関連ブログ記事
📝 関連記事
最新動向(2026年)
ハードウェアRNGの普及
Intel RDRAND/RDSEED、AMD RNDR、ARM TRNGなど、CPUに組み込まれたハードウェア乱数生成器が標準で使用されるようになっています。
量子乱数生成器(QRNG)
量子力学的現象を利用した真の乱数生成器が商用化されています。クラウドサービスとしても提供され始めています。
トラブル事例と対策
🚨 重大な脆弱性:弱い乱数生成器の使用
事例:2012年、複数のWebサーバーでMath.random()ベースのセッションIDが予測され不正アクセス
対策:暗号用途には必ずCSPRNGを使用。random、Math.random()は絶対に使わない
⚠️ 仮想環境でのエントロピー不足
問題:VM起動直後にエントロピーが不足し、鍵生成がブロック
対策:havegedの導入、virtio-rngによるホストからのエントロピー供給
権威あるリソース
- NIST SP 800-90A - Recommendation for Random Number Generation
- RFC 4086 - Randomness Requirements for Security
- Python secrets module
