1. SecureRandomとは
SecureRandomは、**暗号論的に安全な乱数(CSPRNG:Cryptographically Secure Pseudo-Random Number Generator)**を生成するためのJavaクラスです。java.securityパッケージに含まれ、セキュリティトークン、APIキー、暗号鍵などの生成に利用されます。
通常のRandomクラスは予測可能な乱数を生成するため、攻撃者にシードを特定される危険性があります。
対してSecureRandomはOSの暗号エンジンを利用して予測不能な乱数を生成します。
2. Randomとの違い
| 項目 | Random | SecureRandom | 
|---|---|---|
| 主な用途 | ゲーム・抽選・シミュレーション | 暗号・セキュリティ関連 | 
| 再現性 | シード指定で再現可能 | 予測困難・安全性重視 | 
| エントロピー源 | 疑似乱数(数列) | OSの乱数エンジン | 
| パフォーマンス | 高速 | やや低速(安全性優先) | 
| 実装場所 | java.util | java.security | 
3. Javaバージョン別の対応ポイント
| バージョン | 特徴・変更点 | 
|---|---|
| Java 8 | 最も広く使われる環境。SecureRandomはデフォルトで十分安全。getInstanceStrong()も使用可能(JDK実装依存)。 | 
| Java 11 | Base64.getUrlEncoder()などの標準エンコーダが安定。マルチスレッド環境でのSecureRandom利用も改善。 | 
| Java 17 (LTS) | デフォルトの乱数アルゴリズムが強化(DRBGが推奨)。新しいSecureRandom実装が追加。 | 
| Java 21 (LTS) | SecureRandomのアルゴリズム選択がより細かく制御可能に。DRBGがデフォルトで推奨パス。 | 
💡 DRBGとは?
Java 17以降では、NIST標準(SP800-90A)に準拠したDRBG(Deterministic Random Bit Generator)が使用可能です。
これは暗号学的により強固な乱数生成手法で、今後の推奨実装となります。
4. サンプルコード:安全なトークン生成
🧩 出力例:
5. 高度な使い方(Java 17以降対応)
✅ 強力なDRBGインスタンスを明示的に取得
💡 HexFormatはJava 17で追加された便利クラスです。Base64よりも短い表現でログ出力に適しています。
6. よくある利用シーン
| シーン | 使用目的 | 推奨API | 
|---|---|---|
| 認証トークン生成 | セッションIDやAPIキー | SecureRandom + Base64 | 
| CSRFトークン | Webフォームの保護 | SecureRandom + HexFormat | 
| パスワードリセットURL | 予測困難な一時リンク生成 | getInstanceStrong() | 
| 暗号鍵生成 | AESなどの鍵素材 | SecureRandom | 
| UUID代替 | 高強度ランダムID | SecureRandomで独自生成 | 
7. ベストプラクティス
| 推奨事項 | 理由 | 
|---|---|
| SecureRandomの使い回し | 毎回生成するとコストが高い | 
| OS依存のソースを活用 | /dev/urandomなどで高品質な乱数 | 
| getInstanceStrong()を必要時のみ使用 | 起動が遅くなるため常用は非推奨 | 
| Base64やHexFormatで可読化 | ログやトークンで扱いやすい | 
| シード指定は避ける | セキュリティが低下するため | 
8. パフォーマンス比較(目安)
| 操作 | 平均速度 | 安全性 | 
|---|---|---|
| Random.nextInt() | 非常に高速 | 低 | 
| SecureRandom.nextInt() | 中程度 | 高 | 
| SecureRandom.getInstanceStrong() | やや遅い | 最高 | 
| SecureRandom (DRBG) | 中〜高 | 最高(推奨) | 
9. まとめ
| ポイント | 内容 | 
|---|---|
| 用途 | 暗号・認証・トークン生成に最適 | 
| バージョン対応 | Java 8〜21全対応 | 
| 推奨実装 | SecureRandom または DRBG(Java 17+) | 
| 注意点 | シード指定・再生成の多用を避ける | 
| 一言 | 安全性を重視する場面では必ずSecureRandomを! | 
🧠 コラム:SecureRandomを使うべき「具体例」
- 
OAuth 2.0 認可コードの生成 
- 
JWTの署名鍵生成 
- 
Cookieの session_id生成
- 
APIトークン・CSRFトークン・暗号鍵など 
→ 「ユーザーや外部に漏れたら困る値」には必ずSecureRandom!

