Java中的隨機數與安全隨機數


Java 提供了兩個用於生成隨機數的類 - SecureRandom.java 和 Random.java。隨機數通常可用於加密金鑰、會話金鑰或 Web 伺服器上的簡單密碼。SecureRandom 位於 java.security 包中,而 Random.java 位於 java.util 包中。這兩個類之間最基本和重要的區別在於,SecureRandom 生成更不可預測的隨機數,因為它實現了密碼學安全偽隨機數生成器 (CSPRNG),而 Random 類則使用線性同餘生成器 (LCG)。

這裡需要提到的一點是,SecureRandom 是 Random 類的子類,並繼承了其所有方法,例如 nextBoolean()、nextDouble()、nextFloat()、nextGaussian()、nextInt() 和 nextLong()。

Random 和 SecureRandom 之間的其他區別包括 -

  • Random 類使用系統時間作為其生成演算法的輸入,而 SecureRandom 類使用來自作業系統的隨機資料,例如 I/O 事件的計時。

  • 由於 SecureRandom 使用複雜的演算法使其更不可預測,因此在建立安全隨機數時,它比隨機數消耗更多的記憶體。

  • Random 類只有 48 位,而 SecureRandom 可以最多有 128 位,這使得 SecureRandom 中重複的機率更小。也因此,破解 Random 數預測的嘗試次數為 2^48,而 SecureRandom 數的嘗試次數為 2^128,這再次使其更安全。

隨機數生成示例

 線上演示

import java.util.Random;
public class RandomClass {
   public static void main(String args[]) {
      Random objRandom = new Random();
      int randomInt1 = objRandom.nextInt(1000);//1000 is range i.e number to be generated would be          between 0 and 1000.
      int randonInt2 = objRandom.nextInt(1000);
      System.out.println("Random Integers: " + randomInt1);
      System.out.println("Random Integers: " + randonInt2);
   }
}

輸出

Random Integers: 459
Random Integers: 348

SecureRandom 數生成示例

 線上演示

import java.security.SecureRandom;
public class SecureRandomClass {
   public static void main(String args[]) {
      SecureRandom objSecureRandom = new SecureRandom();
      int randomInt1 = objSecureRandom.nextInt(1000);
      int randonInt2 = objSecureRandom.nextInt(1000);
      System.out.println("Random Integers: " + randomInt1);
      System.out.println("Random Integers: " + randonInt2);
   }
}

輸出

Random Integers: 983
Random Integers: 579

更新於: 2020-06-25

3K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告