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实现将始终生成随机数据).