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