SecureRandom中的nextXXX()和generateSeed()函数之间的区别?

Ash*_*hok 6 java security random cryptography

是什么样的功能nextXXX之间的差异() -比如像nextInt(),nextFloat()nextBytes()-和generateSeed(int numBytes): byte[]SecureRandom的类的Java?

"种子生成算法"以何种方式generateSeed与安全随机生成器本身不同?

Maa*_*wes 10

generateSeed()不使用随机数生成器生成的任何字节.相反,它只是一个传递给熵源的SecureRandom实现,当它它自己播种时,实现用它来播种自身.


因此,例如在Oracle提供的Java SE上调用以下代码:

// initSeed is just zero valued bytes
byte[] initSeed = new byte[16];

SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(initSeed);

byte[] seed = secureRandom.generateSeed(16);

byte[] data = new byte[16];
secureRandom.nextBytes(data);

System.out.printf("Seed: %s%n", Hex.toHexString(seed));
System.out.printf("Data: %s%n", Hex.toHexString(data));
Run Code Online (Sandbox Code Playgroud)

实际上会回馈不同的值seed,并且总是相同的值data.换句话说,generateSeed使用操作系统要求16字节的熵,而随机数发生器仅用于播种,initSeed因此将始终生成相同的随机数流.

警告:这只是为了说明这一点; 你应该依赖于任何SecureRandom情况下返回什么,但随机字节.关于setSeed每个实现的行为有所不同.Oracle "SHA1PRNG"提供商将其用作唯一的种子,其他人可以选择将其混合到PRNG的状态(例如,稍后Android实现将始终生成随机数据).