SecureRandom自播种

时间:2013-06-09 11:07:00

标签: java random

我发现很多关于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方法,SecureRandom中的next方法的文档都没有说明播种的内容。

我的问题是:上面提到的Random个对象是肯定的吗?这些例子都是错的还是我错过了什么?我可以安全地使用这种非种子随机数发生器吗?

正如评论中正确指出的,查看source code似乎next调用nextBytes,因此初始化种子,但文档中未提及。

1 个答案:

答案 0 :(得分:4)

使用Sun的JRE,可以在没有播种的情况下使用SecureRandom吗?不,因为@assylias在他的评论中指出了这一点。 nextInt调用nextBytes,确保SecureRandom播种。

Java平台的替代实现是否可以提供SecureRandom,可以在没有播种的情况下使用,同时仍然符合文档化的界面?是。那会不好?哦,是的。任何实施者都会这么愚蠢吗?可能不是。这是Java程序员需要担心的事情吗?否。