我发现了很多关于这个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
借助Sun的JRE,可以SecureRandom在没有种子的情况下使用它吗?不,由于@assylias在他的评论中指出的原因。nextInt调用nextBytes,以确保SecureRandom已播种。
Java平台的替代实现SecureRandom是否可以提供无需播种就可以使用,而仍然符合已记录的接口?是。那会不好吗?哦是的 任何实施者都会如此做而愚蠢吗?可能不会。Java程序员需要担心的事情吗?没有。
| 归档时间: |
|
| 查看次数: |
1167 次 |
| 最近记录: |