我发现了很多有关 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) 在其文档中都包含以下部分:



因此,在上面的示例中,从不在创建时播种 Random 对象。 nextInt() 的文档(从Random类的文档中,不能在SecureRandom中覆盖):


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

因此,没有对 nextBytes 方法的调用,而且next中有关 SecureRandom 方法的文档也没有说明任何有关播种的内容。

我的问题是:上面的Random对象是否确定为种子?所有这些示例都是错误的,还是我缺少了什么?我可以安全地使用这种无种子的随机数生成器吗?

正如在注释中正确指出的那样,看着source code似乎next调用nextBytes,因此初始化了种子,但是在文档中未提及。

最佳答案

借助Sun的JRE,是否可以在没有种子的情况下使用SecureRandom?不,由于@assylias在其评论中指出的原因。 nextInt调用nextBytes,以确保SecureRandom成为种子。

Java平台的替代实现是否可以提供SecureRandom,而该ojit_code无需种子即可使用,同时仍符合已记录的接口(interface)?是的。那会不好吗?哦是的。实现者会如此愚蠢以至于会做这样的事情吗?可能不会。 Java程序员需要担心的事情吗?不。

关于java - SecureRandom自播,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17008967/

10-10 13:51