我发现了很多关于这个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
的文档也没有说明任何关于播种的内容。next
SecureRandom
我的问题是:上述Random
对象确定是播种的吗?所有这些例子都是错的还是我遗漏了什么?我可以安全地使用这种非种子随机数生成器吗?
正如评论中正确指出的那样,查看源代码似乎是next
调用nextBytes
,因此初始化了种子,但是文档中没有提到这一点。