Java 21的Pseudorandom的筆記

jackieathome發表於2024-09-10

Linux系統下,常見的隨機數生成裝置:

  • /dev/random
    隨機性比較好,依賴核心的中斷,當中斷數量不足,獲取隨機數的操作會被阻塞。透過安裝haveged,可以提升熵值。
    JDK的預設選項。

  • /dev/urandom
    透過熵池來產生隨機數,犧牲一定的隨機性,解決效能問題。
    啟動Java應用時,增加如下選項,指定使用/dev/urandom作為隨機數生成器。

    -Djava.security.egd=file:/dev/./urandom
    

文件

  • Java Core Libraries

  • Pseudorandom Number Generators
    PRNGs即Pseudorandom Number Generators。

  • Characteristics of PRNGs

  • Generating Pseudorandom Numbers with RandomGenerator Interface
    使用RandomGenerator來獲取隨機數,樣例程式碼,如下:

    RandomGenerator random1 = RandomGenerator.of("Random");
    long value1 = random1.nextLong();
    System.out.println(value1);
    

    使用RandomGeneratorFactory來建立隨機數生成器,並獲取隨機數,樣例程式碼,如下:

    RandomGeneratorFactory<RandomGenerator> factory2 =
        RandomGeneratorFactory.of("SecureRandom");
    RandomGenerator random2 = factory2.create();
    long value2 = random2.nextLong();
    System.out.println(value2);
    

    使用Random來獲取隨機數,樣例程式碼,如下:

    Random random = new Random();
    int randomNumber = random.nextInt();
    System.out.println(randomNumber);
    

    使用SecureRandom來獲取隨機數,樣例程式碼,如下:

    SecureRandom r1 = new SecureRandom();
    SecureRandom r2 = SecureRandom.getInstance("NativePRNG");
    SecureRandom r3 = SecureRandom.getInstance("DRBG",
            DrbgParameters.instantiation(128, RESEED_ONLY, null));
    

    RandomGenerator的幾個子類,如下:

    • RandomGenerator.StreamableGenerator
    • RandomGenerator.SplittableGenerator
    • RandomGenerator.LeapableGenerator
    • RandomGenerator.JumpableGenerator
    • RandomGenerator.ArbitrarilyJumpableGenerator
  • Generating Pseudorandom Numbers in Multithreaded Applications

  • Dynamically Creating New Generators

  • Creating Stream of Generators

  • Choosing a PRNG Algorithm
    透過使用RandomGenerator.isDeprecated()或者RandomGeneratorFactory.isDeprecated(),可以檢查隨機數生成演算法是否被Java官方推薦使用。
    當前可用的隨機數生成演算法:

    • L64X128MixRandom
    • Xoroshiro128PlusPlus
    • L32X64StarStarRandom
    • L32X64MixRandom
    • Xoshiro256PlusPlus
    • L64X256MixRandom
    • MRG32k3a
    • L128X128MixRandom
    • L128X256MixRandom
    • L64X1024MixRandom
    • L128X1024MixRandom

    選擇隨機數生成器時,平衡如下因素:

    • speed,生成隨機數的速度
    • space,演算法執行時佔用的空間
    • period,隨機數的生成周期

參考資料

  • Java獲取/dev/urandom的隨機數
  • java dev urandom_/dev/random和/dev/urandom的一點備忘
  • /dev/urandom和/dev/random的區別
  • linux 手動安裝移植 haveged,解決隨機數初始化慢的問題
  • 熵值低於1000,需要啟動haveged
  • haveged的程式碼倉庫

    Additionally, since v5.6, as soon as the CRNG (the Linux cryptographic-strength random number generator) gets ready, /dev/random does not block on reads anymore.

  • haveged的官方主頁
  • 在Java中,可以使用java.util.Random類來生成隨機數,使用Java生成隨機數的示例程式碼
  • 【Java程式碼審計】失效認證及不安全隨機數篇
  • Procedual Generation in Minecraft - Structure Generation

相關文章