Random采用了(Linear Congruential Generator)线性同余算法(n*i + m)%l进行伪随机变换,seed为基数加当前nano时间戳。
SecureRandom采用更复杂的 SHA1PRAP算法,并且在初始化时,通过系统的properties变量、temp文件夹下文件大小,内存剩余,本地ip地址等系统变量的sha1散列值作为seed。
Random是可预测的随机函数。即只要输入的seed一样,则结果是一致的,所以只要知道了seed,结果就是可预测的。例如:
Random r1 = new Random(1);
Random r2 = new Random(1);
r1.nextInt() == r2.nextInt()
SecureRandom不可预测,例如:
SecureRandom r1 = new SecureRandom();
SecureRandom r2 = new SecureRandom();
byte[] b1 = new byte[10];
r1.nextBytes(b1);
byte[] b2 = new byte[10;
r2.nextBytes(b2);
b1 != b2;
对于RFC标准定义的不可预测的强随机数,可采用系统中cpu消耗,线程切换时间,用户鼠标点击动作,磁盘文件大小等不可预测数据作为seed进行随机化计算。
SecureRandom比Random更安全。假设某网站通过Random随机化session串,hacker只需要获取几个session串后,即可推论出以后的随机session串值。
UUID是基于SecureRandom产生的随机串生成。