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

问题描述 投票:6回答:2

函数nextXXX()之间有什么区别 - 比如nextInt()nextFloat()nextBytes() - 以及Java的generateSeed(int numBytes): byte[]中的SecureRandom class

generateSeed中的“种子生成算法”与安全随机生成器本身有什么不同?

java security random cryptography
2个回答
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));

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

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


3
投票

随机数函数取决于它们生成随机数序列的初始值(在PRNG上读取 - 伪随机数生成)。 next函数将返回从该初始值(种子)生成的下一个数字。 generateSeed()将为PRNG生成一个新的初始值。

© www.soinside.com 2019 - 2024. All rights reserved.