📜  Java的随机数与安全随机数

📅  最后修改于: 2021-09-16 10:23:20             🧑  作者: Mango

先决条件:在Java生成随机数
Java.security.SecureRandom 类:这个类提供了一个加密强的随机数生成器(RNG)。加密强随机数最低限度地符合 FIPS 140-2,加密模块的安全要求,第 4.9.1 节中指定的统计随机数生成器测试。此外,SecureRandom 必须产生非确定性输出。因此,传递给 SecureRandom 对象的任何种子材料都必须是不可预测的,并且所有 SecureRandom 输出序列都必须具有强大的加密能力。
Java.util.Random 类: Random 中定义的类在密码学上不强,选择的数字也不是完全随机的,因为使用确定的数学算法(基于 Donald E. Knuth 的减法随机数生成器算法)来选择它们。因此,将此类用于需要高级别安全性的任务是不安全的,例如创建随机密码等。

随机与安全随机

  1. 大小: Random 类只有 48 位,而 SecureRandom 最多可以有 128 位。所以在 SecureRandom 中重复的机会更小。
  2. 种子生成: Random 使用系统时钟作为种子/或生成种子。因此,如果攻击者知道生成种子的时间,它们就可以轻松复制。但是 SecureRandom 从您的操作系统中获取随机数据(它们可以是击键之间的间隔等 – 大多数操作系统收集这些数据并将它们存储在文件中 – /dev/random 和 /dev/urandom 在 linux/solaris 的情况下)并将其用作种子.
  3. 破解密码:在随机的情况下,只需要2^48次尝试,以当今先进的cpu,在实际时间里破解它是可能的。但是对于 securerandom 将需要 2^128 次尝试,这将需要数年和数年才能与当今先进的机器保持平衡。
  4. 生成函数:标准的 Oracle JDK 7 实现使用所谓的线性同余生成器在Java.util.Random 中生成随机值。而 Secure Random 实现了 SHA1PRNG 算法,该算法使用 SHA1 生成伪随机数。该算法在一个真正的随机数上计算 SHA-1 哈希(使用熵源),然后将它与一个 64 位计数器连接起来,每次操作都会增加 1。
  5. 安全性:因此, Java.util. random 类不得用于安全关键应用程序或用于保护敏感数据。

使用Java.util.Random 生成随机数;

Java
// A Java program to demonstrate
// random number generation
// using java.util.Random;
import java.util.Random;
 
public class generateRandom {
 
    public static void main(String args[])
    {
        // create instance of Random class
        Random rand = new Random();
 
        // Generate random integers in range 0 to 999
        int rand_int1 = rand.nextInt(1000);
        int rand_int2 = rand.nextInt(1000);
 
        // Print random integers
        System.out.println("Random Integers: " + rand_int1);
        System.out.println("Random Integers: " + rand_int2);
    }
}


Java
// A Java program to demonstrate secure
// random number generation
// using java.security.SecureRandom
import java.security.SecureRandom;
 
public class generateRandom {
 
    public static void main(String args[])
    {
        // create instance of SecureRandom class
        SecureRandom rand = new SecureRandom();
 
        // Generate random integers in range 0 to 999
        int rand_int1 = rand.nextInt(1000);
        int rand_int2 = rand.nextInt(1000);
 
        // Print random integers
        System.out.println("Random Integers: " + rand_int1);
        System.out.println("Random Integers: " + rand_int2);
    }
}


输出:

Random Integers: 956
Random Integers: 678

使用Java.security.SecureRandom 生成随机数;

Java

// A Java program to demonstrate secure
// random number generation
// using java.security.SecureRandom
import java.security.SecureRandom;
 
public class generateRandom {
 
    public static void main(String args[])
    {
        // create instance of SecureRandom class
        SecureRandom rand = new SecureRandom();
 
        // Generate random integers in range 0 to 999
        int rand_int1 = rand.nextInt(1000);
        int rand_int2 = rand.nextInt(1000);
 
        // Print random integers
        System.out.println("Random Integers: " + rand_int1);
        System.out.println("Random Integers: " + rand_int2);
    }
}

输出:

Random Integers: 817
Random Integers: 500