SecureRandom自播种

eff*_*ffe 10 java random

我发现了很多关于这个SecureRandom类的例子:

Random random = new SecureRandom();
int randomInteger = random.nextInt();
Run Code Online (Sandbox Code Playgroud)

或者像这样:

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

或类似的东西.

然而,无论是SecureRandom()SecureRandom.getInstance(String)有这部分的文档:

返回的SecureRandom对象尚未播种.要为返回的对象设定种子,请调用该setSeed方法.如果setSeed未调用,则第一次调用nextBytes将强制SecureRandom对象自行播种.如果setSeed之前被调用,则不会发生这种自播种.

因此,Random在上面的例子中,对象永远不会在创建时播种.的文件nextInt()(从Random,它不是在覆盖类文件SecureRandom)规定:

该方法nextInt由类实现,Random如下所示:

public int nextInt() {
    return next(32);
}
Run Code Online (Sandbox Code Playgroud)

那么,有没有调用一个nextBytes方法,既不是为了在文档next中方法SecureRandom说,大约播种什么.

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

正如在评论中正确指出的那样,查看它看起来像是调用的源代码,因此初始化种子,但是文档中没有提到.nextnextBytes

Ale*_*x D 5

借助Sun的JRE,可以SecureRandom在没有种子的情况下使用它吗?不,由于@assylias在他的评论中指出的原因。nextInt调用nextBytes,以确保SecureRandom已播种。

Java平台的替代实现SecureRandom是否可以提供无需播种就可以使用,而仍然符合已记录的接口?是。那会不好吗?哦是的 任何实施者都会如此做而愚蠢吗?可能不会。Java程序员需要担心的事情吗?没有。

  • 文档缺少什么吗?可能是。 (3认同)
  • 两个月后,据悉 [google 没有费心在 Android 手机上植入 SecureRandom,这导致数千美元被盗](https://arstechnica.com/information-technology/2013/08/google-confirms-critical -android-crypto-flaw-used-in-5700-bitcoin-heist/)。 (3认同)