【问题标题】:Is it guaranteed that 2 sequential calls to secure random will give different numbers?是否保证 2 次连续调用安全随机数会给出不同的数字?
【发布时间】:2015-10-05 01:25:21
【问题描述】:

使用SecureRandom 是否有保证 2 个连续调用不会返回相同的数字?
如果这是客户端 API 端的严格要求,那么代码中的以下循环是否多余?

Random random = SecureRandom.getInstance("SHA1PRNG");  
long value1 = (long)(r.nextDouble() * LIMIT) + 1;  
long value2 = (long)(r.nextDouble() * LIMIT);  

while(value1 == value2) {  
   value2 = (long)(r.nextDouble() * LIMIT);  
}

【问题讨论】:

  • 这样的保证会违背随机性,所以不会:)

标签: java random integer sha1 secure-random


【解决方案1】:

没有。不能保证并且保证会降低安全性,因为攻击者可能会利用您在连续呼叫中永远不会获得相同号码的知识。随机数字序列完全有可能包含数字的“运行”。如果您有一个数字列表,从中您有相同的机会选择任何个数字,那么您很有可能可以选择两次相同的数字。当然,这种情况发生的概率低于得到两个不同数字的序列的概率,但也不是零。

此外,CSPRNG 的要求之一是,给定一个状态,您不应该能够预测下一个状态(即,您范围内的所有数字都有相同的出现概率)。但是根据您的要求,您可以预测,如果您的随机数在0n 范围内生成一个数字x,那么在下一次调用中您将得到任何数字但是 @987654324 @。

虽然 CSPRNG 内部可能存在某种状态机,但每个调用本质上独立于之前的调用,不应受它们的影响。

如果您想要唯一性,您应该使用 UUID 之类的东西。这些可以随机生成,具有唯一性的优势(如果您使用 CSPRNG 并且种子源具有足够的熵)。

如果要求客户端没有得到两个相同的随机数,那么代码不是多余的。但这会违反“随机性”属性;这有多重要,取决于您的具体情况。

【讨论】:

  • 我认为 CSPRNG 的连续 128 位输出比两个随机 UUID 更有可能是唯一的。两者都具有无限小的重复机会,否则它们将不符合“随机”的条件,但 UUID 的许多位是可预测的,而 CSPRNG 的所有 128 位都是不可预测的。否则,很好的答案。
  • @erickson 绝对是的。归根结底,与两次获得相同的 128 位数字相比,两次获得相同的 v4 UUID 的机会更大。但正如你所说,实际应用的机会是微乎其微的。
【解决方案2】:

通过调用nextDouble(),您实际上是在调用Random.nextDouble() - SecureRandom 扩展Random 并且不会覆盖nextDouble()

根据nextDouble() 的文档 - 没有保证 2 个连续调用不会返回相同的数字 - 也就是说,它发生的可能性非常低。

【讨论】:

    【解决方案3】:

    我没想到会有。每个调用都应该是独立的 - 要求下一个调用不会给出与前一个相同的结果,这意味着它不是随机的,IMO。

    举一个更小的例子,假设我们没有nextDouble,而是一个返回1到3范围内值的方法。通过消除两次返回相同值的可能性,您有效地将每次调用限制为 50/50 的选择,没有明显的原因。您将向任何可以观察“此”呼叫的人提供有关下一次呼叫的额外信息。

    现在显然double 有一个更大的范围 - 所以两个真正随机选择的值是相同的。不完全是 264 中的 1,但相当大。

    当然,您已经通过算术减少了这一点 - 即使 nextDouble() 确实 保证总是返回不同的值,两个 double 值完全有可能具有相同的结果当乘以LIMIT 然后转换为long。想象一下,如果LIMIT 是 2,例如……您希望看到多少个可能的值?

    所以不,如果您有严格的客户要求,我认为您拥有的代码不是多余的。

    【讨论】:

      猜你喜欢
      • 2011-09-16
      • 2015-01-29
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 2020-09-30
      • 1970-01-01
      • 2016-02-16
      相关资源
      最近更新 更多