我发现了很多有关 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/