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