函数 nextXXX() - 例如 nextInt() , nextFloat() nextBytes() - 和 Java 的 generateSeed(int numBytes): byte[] 中的 SecureRandom class 有什么区别?
generateSeed 中的“种子生成算法”与安全随机生成器本身有何不同?

最佳答案

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));

实际上会为 seed 返回不同的值,并且总是为 data 返回相同的值。换句话说,generateSeed 使用操作系统要求 16 字节的熵,而随机数生成器只用 initSeed 做种子,因此将始终生成相同的伪随机数流。

警告 :这只是为了说明这一点;你应该 而不是 依赖任何 SecureRandom 实例来返回随机字节以外的任何内容。 setSeed 的行为因实现而异。 Oracle "SHA1PRNG"提供程序将其用作唯一的种子,其他人则可以选择将其混合到PRNG的状态中(例如,以后的Android实现将始终生成随机数据)。

10-07 15:33