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+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告