Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Tomcatが起動しない!?SecureRandomと乱数デバイスの罠​

Avatar for k.fujikawa8 k.fujikawa8
November 15, 2025

 Tomcatが起動しない!?SecureRandomと乱数デバイスの罠​

2025/11/15 JJUG Fall 株式会社ケープロジェクト ふじきゃわ発表
※本資料は古いLinuxへの対応履歴です、最新のLinuxでは/randomもブロックしないような改善が行われていますのでご注意ください。

参考記事:https://megascus.hatenablog.com/entry/2024/08/22/151816
 「最新のLinuxと古めのLinuxが混在している環境での/dev/randomを使っての乱数生成に注意」
#Java

Avatar for k.fujikawa8

k.fujikawa8

November 15, 2025
Tweet

More Decks by k.fujikawa8

Other Decks in Technology

Transcript

  1. 現場で起きたTomcat起動後アプリ停止事件 • 環境:Linux + Java 11 + Tomcat8.5 • 症状:毎朝早朝にTomcatを自動起動していたが、

    始業開始頃に「500エラー」が発生。 エラーが発生する際のログは決まっていつも最後は、 アプリ側のログ:「ログイン要求が発生しました」 • 補足:Windows顧客では発生していない。
  2. SecureRandomとは • Javaで乱数を生成するクラスは・・・ java.util.Random java.security.SecureRandom 用途 普通の乱数を生成する 暗号論的に安全なセキュアな乱数を生成する 特徴 ゲーム・シミュレーションなど

    セキュリティ用途(パスワード・トークンなど) 生成速度 速い 遅い 特徴 疑似乱数(PRNG)予測されやすい 暗号学的 PRNG(CSPRNG)予測不能で安全
  3. java.util.Random import java.util.Random; Random random = new Random(); int iv

    = random.nextInt(100); //int型の乱数を生成 double dv = random.nextDouble(); //double型の乱数を生成
  4. java.security.SecureRandom import java.security.SecureRandom; SecureRandom secureRandom = new SecureRandom(); int iv

    = secureRandom.nextInt(100); // int型の乱数 double dv = secureRandom.nextDouble(); // double型の乱数
  5. java.util.Random import java.util.Random; Random r1 = new Random(); Random r2

    = new Random(); r1.setSeed(12345); r2.setSeed(12345); System.out.println(r1.nextInt()); // 1553932502 System.out.println(r2.nextInt()); // 1553932502 同じシード値なら 同じ乱数を出す
  6. java.security.SecureRandom import java.security.SecureRandom; SecureRandom sr1 = new SecureRandom(); SecureRandom sr2

    = new SecureRandom(); sr1.setSeed(12345); sr2.setSeed(12345); System.out.println(sr1.nextInt()); // 974898412 System.out.println(sr2.nextInt()); // -1317823390 同じシード値でも 異なる乱数を出す
  7. 乱数生成器:RNG • 乱数を作る装置、アルゴリズム全般のこと • 大きく分けて2種類。 TRNG (True RNG ) 真性乱数生成器

    PRNG (Pseudo RNG ) 擬似乱数生成器 自然現象 から 乱数を取るもの 電気ノイズや熱 アルゴリズムで計算をして 乱数っぽく作るもの
  8. 乱数生成器:RNG • 乱数を作る装置、アルゴリズム全般のこと • 大きく分けて2種類。 TRNG (True RNG ) 真性乱数生成器

    PRNG (Pseudo RNG ) 擬似乱数生成器 CSPRNG (Cryptographically Secure PRNG ) 暗号論的擬似乱数生成器
  9. javaでの PRNG 擬似乱数生成器 PRNG (Pseudo RNG ) 擬似乱数生成器 CSPRNG (Cryptographically

    Secure PRNG ) 暗号論的擬似乱数生成器 java.util.Random java.security.SecureRandom
  10. PRNG と CSPRNG の比較表 クラス例 乱数源 再現性 生成速度 予測され やすさ

    PRNG 擬似乱数生成器 Random シード値(種) あり (アルゴリズムで決まってしまう) 速い シードが漏れると可能性あり CSPRNG 暗号論的擬似乱数生成器 SecureRandom シード値(種)+エントロピー(乱雑さ) なし 遅い シードが漏れても割り出しにくい
  11. 現場で起きたTomcat起動後アプリ停止事件 • 環境:Linux + Java 11 + Tomcat8.5 • 症状:毎朝早朝にTomcatを自動起動していたが、

    始業開始頃に「500エラー」が発生。 エラーが発生する際のログは決まっていつも最後は、 アプリ側のログ:「ログイン要求が発生しました」 • 補足:Windows顧客では発生していない。 振り返りシート
  12. 現場で起きたTomcat起動後アプリ停止事件 • 環境:Linux + Java 11 + Tomcat8.5 • 症状:毎朝早朝にTomcatを自動起動していたが、

    始業開始頃に「500エラー」が発生。 エラーが発生する際のログは決まっていつも最後は、 アプリ側のログ:「ログイン要求が発生しました」 • 補足:Windows顧客では発生していない。 振り返りシート
  13. 今後の対策 1.SHA1PRNG を明示指定しない SecureRandom sr1 = new SecureRandom(); →JVM がその

    OS と環境に最適な実装(NativePRNG系とか) を選んでくれる。 2.Java9以降なら、DRBGを指定して実装する。 SecureRandom sr = SecureRandom.getInstance(“DRBG”,省略); →Javaの最新の強度が高い乱数生成器で、 初回のみブロックするが、以降はブロックしない特性を持つ。