我应该播种SecureRandom吗?

时间:2011-09-30 08:55:33

标签: java random

在我们的代码库中找到以下代码:

public static final int DEFAULT_LENGTH = 16;
private static SecureRandom SR;
static
{
   try
   {
      SecureRandom sd0 = new SecureRandom();
      SR = new SecureRandom(sd0.generateSeed(DEFAULT_LENGTH * 2));
   }
   catch (Exception e){}
}

这里创建了一个默认的SecureRandom,然后用于为另一个创建种子,该种子将在稍后的类中使用。这真的有必要吗?第二个是否比第一个更好,因为这样做了?

当第二个生成种子时,给出了字节数,这个重要吗? SecureRandom播种的字节数是否可能比其他字节更好或更差?用于播种它的字节数是否应该与它将用于什么?

相对应
  

如果未调用setSeed,则对nextBytes的第一次调用将强制SecureRandom对象自行播种。如果先前调用了setSeed,则不会发生这种自播种。 - javadoc

自播不够好吗?它取决于它将用于什么?


注意:对于某些上下文,它在类中使用,为存储在数据库中的内容创建随机ID。

5 个答案:

答案 0 :(得分:20)

我认为这完全是不必要的,因为你引用的Javadoc清楚地说明:默认构造的SecureRandom个实例为自己种子。写这篇文章的人可能不知道。

它们实际上也可能通过强制固定种子长度来降低安全性,而种子长度可能不太适合RNG实施。

最后,假设片段未经更改发布,静音异常吞咽也不是很好的编码风格。

答案 1 :(得分:6)

避免使用执行new SecureRandom();

时的默认算法

取而代之的是:

SecureRandom.getInstance("SHA1PRNG", "SUN");

如果有人更改默认算法(如@Jules所述),您将不会受到影响。


为Android编辑:

对于android,请看一下:

  

在Android上,我们不建议您指定提供商。一般来说,   任何调用Java Cryptography Extension(JCE)API指定一个   只有在提供者包含在提供者中时才应该提供提供者   申请或如果申请能够处理可能的   ProviderNotFoundException异常。

...

  

在Android N中我们弃用了SHA1PRNG的实现   算法和加密提供程序

答案 2 :(得分:5)

这不仅是完全没必要的,它实际上可能会增加SecureRandom对象生成的数字的可预测性。

没有明确种子集的SecureRandom将自行播种。它使用高度随机的数据源来执行此操作,并且非常安全。代码示例中的第一个SecureRandom将使用这样的种子。

第二个是通过产生256个随机位从第一个播种。假设使用了系统默认的SHA1PRNG,这就足够了。它使用160位状态,因此256个随机位将完全满足它的要求。但是假设现在有人认为这还不够,并将默认值切换为SHA512PRNG(他们甚至可以通过更改java的安全属性来查看代码)。现在你提供的种子位太少了:它只需要它的一半。

摆脱它,只使用自种对象,除非你有比系统更好的种子数据来源。

答案 3 :(得分:1)

这是这个答案的附录。根据谷歌的说法,如果你在android中使用这个代码,你肯定应该使用像/ dev / urandom或/ dev / random这样的高熵源来获取SecureRandom。

即使是下面的帖子现在已经有一年了,也许这已经得到了纠正,但我无法确认是否是。

https://plus.google.com/+AndroidDevelopers/posts/YxWzeNQMJS2

编辑:

似乎该类的默认行为现在是帖子中指定的行为,因此再次认为不需要播种:

http://developer.android.com/reference/java/security/SecureRandom.html

答案 4 :(得分:0)

令人遗憾的是, javadoc 并没有说,达到“算法设计”预期安全级别的最小种子大小“ DEFAULT_LENGTH”是什么,甚至对于某些默认实现也不是。 :(

本质上,安全性取决于真正的随机性;没有什么比“没有外部数据的算法播种自己”。除非公开种子生成器的输入,否则无法证明任何安全级别。

真正随机的提供者是 1.)https://www.random.org/ 2.)VeraCrypt等工具可通过鼠标移动来产生白噪声。

如果您的目标是真正的安全性,则将匿名随机生成器中的数字与自我确定的白噪声相结合。