我发现很多关于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
,因此初始化种子,但文档中未提及。
答案 0 :(得分:4)
使用Sun的JRE,可以在没有播种的情况下使用SecureRandom
吗?不,因为@assylias在他的评论中指出了这一点。 nextInt
调用nextBytes
,确保SecureRandom
播种。
Java平台的替代实现是否可以提供SecureRandom
,可以在没有播种的情况下使用,同时仍然符合文档化的界面?是。那会不好?哦,是的。任何实施者都会这么愚蠢吗?可能不是。这是Java程序员需要担心的事情吗?否。