Java 随机自播种
我发现很多关于这个类的例子如下:Java 随机自播种,java,random,Java,Random,我发现很多关于这个类的例子如下: Random random = new SecureRandom(); int randomInteger = random.nextInt(); try { Random random = SecureRandom.getInstance("SHA1PRNG"); int randomInteger = random.nextInt(); } catch (NoSuchAlgorithmException exception) { /
Random random = new SecureRandom();
int randomInteger = random.nextInt();
try
{
Random random = SecureRandom.getInstance("SHA1PRNG");
int randomInteger = random.nextInt();
}
catch (NoSuchAlgorithmException exception)
{
// ...
}
或者像这样:
Random random = new SecureRandom();
int randomInteger = random.nextInt();
try
{
Random random = SecureRandom.getInstance("SHA1PRNG");
int randomInteger = random.nextInt();
}
catch (NoSuchAlgorithmException exception)
{
// ...
}
或者类似的东西
但是,和在其文档中都有此部分:
返回的SecureRandom
对象尚未设定种子。要为返回的对象设置种子,请调用setSeed
方法。如果未调用setSeed
,则对nextBytes
的第一次调用将强制SecureRandom
对象自身进行种子设定。如果先前调用了setSeed
,则不会发生这种自播种
因此,在上面的示例中,对象永远不会在创建时播种。的文档(来自Random
类文档,它在SecureRandom
中不被覆盖)说明:
方法nextInt
是通过类Random
实现的,就像通过:
因此,没有对方法的调用,SecureRandom
中的方法文档也没有提到任何关于种子设定的内容
我的问题是:上面的随机对象是否确定已播种?所有这些例子都是错的还是我遗漏了什么?我能安全地使用这样一个非种子随机数发生器吗
正如一篇评论中正确指出的那样,查看似乎是next
调用nextBytes
,因此初始化种子,但是文档中没有提到这一点。对于Sun的JRE,可以使用SecureRandom
而不进行种子设定吗?不,因为@assylias在评论中指出的原因nextInt
调用nextBytes
,从而确保SecureRandom
被播种
Java平台的替代实现能否提供一个SecureRandom
,它可以在不进行种子植入的情况下使用,同时仍然符合文档化的接口?对那会很糟糕吗?哦,是的。有谁会愚蠢到做这样的事情呢?可能不会。这是Java程序员需要担心的吗?不。next(32)
调用nextBytes
@assylias:你怎么会这么想?我在JDK1.7的源代码中没有看到这样的调用?@assylias:看看(第472行)这似乎是真的,但是文档中没有提到。啊,没关系。是的,SecureRandom将覆盖下一个(int)以使用下一个字节。@assylias,您可以发布此问题的答案。文档是否缺少某些内容?可能是的。两个月后,据了解。