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!