先决条件:在Java生成随机数
Java.security.SecureRandom 类:这个类提供了一个加密强的随机数生成器(RNG)。加密强随机数最低限度地符合 FIPS 140-2,加密模块的安全要求,第 4.9.1 节中指定的统计随机数生成器测试。此外,SecureRandom 必须产生非确定性输出。因此,传递给 SecureRandom 对象的任何种子材料都必须是不可预测的,并且所有 SecureRandom 输出序列都必须具有强大的加密能力。
Java.util.Random 类: Random 中定义的类在密码学上不强,选择的数字也不是完全随机的,因为使用确定的数学算法(基于 Donald E. Knuth 的减法随机数生成器算法)来选择它们。因此,将此类用于需要高级别安全性的任务是不安全的,例如创建随机密码等。
随机与安全随机
- 大小: Random 类只有 48 位,而 SecureRandom 最多可以有 128 位。所以在 SecureRandom 中重复的机会更小。
- 种子生成: Random 使用系统时钟作为种子/或生成种子。因此,如果攻击者知道生成种子的时间,它们就可以轻松复制。但是 SecureRandom 从您的操作系统中获取随机数据(它们可以是击键之间的间隔等 – 大多数操作系统收集这些数据并将它们存储在文件中 – /dev/random 和 /dev/urandom 在 linux/solaris 的情况下)并将其用作种子.
- 破解密码:在随机的情况下,只需要2^48次尝试,以当今先进的cpu,在实际时间里破解它是可能的。但是对于 securerandom 将需要 2^128 次尝试,这将需要数年和数年才能与当今先进的机器保持平衡。
- 生成函数:标准的 Oracle JDK 7 实现使用所谓的线性同余生成器在Java.util.Random 中生成随机值。而 Secure Random 实现了 SHA1PRNG 算法,该算法使用 SHA1 生成伪随机数。该算法在一个真正的随机数上计算 SHA-1 哈希(使用熵源),然后将它与一个 64 位计数器连接起来,每次操作都会增加 1。
- 安全性:因此, 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