11

我发现了很多关于这个SecureRandom类的例子,如下所示:

Random random = new SecureRandom();
int randomInteger = random.nextInt();

或像这样:

try
{
    Random random = SecureRandom.getInstance("SHA1PRNG");
    int randomInteger = random.nextInt();
}
catch (NoSuchAlgorithmException exception)
{
    // ...
}

或类似的东西。

但是,两者都在他们的文档中有这一部分SecureRandom()SecureRandom.getInstance(String)

返回的SecureRandom对象尚未播种。要播种返回的对象,请调用该setSeed方法。如果setSeed未调用,则第一次调用nextBytes将强制SecureRandom对象自己播种。setSeed如果之前调用过,则不会发生这种自播。

因此,Random在上述示例中,对象从未在创建时播种。nextInt()(来自Random类文档,它没有被覆盖)的文档状态SecureRandom

该方法nextInt由类实现,Random就像通过:

public int nextInt() {
    return next(32);
}

因此,没有对方法的调用,该方法nextBytes的文档也没有说明任何关于播种的内容。nextSecureRandom

我的问题是:上述Random对象确定是播种的吗?所有这些例子都是错的还是我遗漏了什么?我可以安全地使用这种非种子随机数生成器吗?

正如评论中正确指出的那样,查看源代码似乎是next调用nextBytes,因此初始化了种子,但是文档中没有提到这一点。

4

1 回答 1

6

有了 Sun 的 JRE,可以SecureRandom不用播种就可以使用吗?不,因为@assylias 在他的评论中指出的原因。nextInt调用nextBytes,确保SecureRandom被播种。

Java 平台的替代实现是否可以提供一个SecureRandom无需播种即可使用,同时仍符合文档化接口的方法?是的。那会很糟糕吗?哦是的。任何实现者会愚蠢到做这样的事情吗?可能不是。这是Java程序员需要担心的事情吗?不。

于 2013-06-09T16:16:35.147 回答