【问题标题】:Mixing other sources of random numbers with ones generated by /dev/urandom将其他随机数源与 /dev/urandom 生成的随机数源混合
【发布时间】:2015-08-05 14:32:03
【问题描述】:

除了my question here,我将使用 random_compat polyfill(它使用/dev/urandom)来生成 1 到 10,000,000 范围内的随机数。

我确实意识到,对于我的项目编码方式,所有事情都是正确的,上述工具应该会产生良好的(如随机/安全等)数据。但是,我想在混合中添加额外的随机源 - 以防万一 6 个月后我读到有适用于我的特定操作系统版本的补丁来修复 /dev/urandom 中的主要错误(或任何其他问题) .

所以,我想我可以从 random.orgfourmilab.ch/hotbits

获得数字

另一种来源是来自我操作的网站的一些日志 - 如果我忽略日期/时间部分并只使用微秒,则计时到微秒 - 这实际上是由人类决定点击关联。我知道这可能被归类为随意而不是随机,但它对我有用吗?

编辑重新时间戳日志 - 将使用 PHP microtime() 创建一个日志,如下所示:

0.**832742**00 1438282477
0.**57241**000 1438282483
0.**437752**00 1438282538
0.**622097**00 1438282572

我将只使用粗体部分。

假设我采用两个额外随机数源 A 和 B,以及 /dev/urandom 的输出,将其称为 U 并设置范围如下:

AB 为 1 - 500,000

U 是 1 - 9,000,000

最终随机数为A+B+U

我将需要数百万个介于 1 到 10,000,000 之间的最终数字

但是 AB 数字池将只包含几千个,但我认为通过使用素数数量我可以将其扩展到数百万个 A&B这样的组合

// this pool will be integers from two sources and contain a larger prime number 
// of members instead of the 7 & 11 here - this sequence repeats at 77
$numbers = array("One","Two","Three","Four","Five","Six","Seven");
$colors = array("Silver","Gray","Black","Red","Maroon","Yellow","Olive","Lime","Green","Aqua","Orange");


$ni=0;
$ci=0;

for ($i=0;$i<$num_numbers_required;$i++) 
    {
    $offset =   $numbers[$ni] + $colors[$ci];

    if ($ni==6) // reset at prime num 7
        $ni=0;
    else
        $ni++;

    if ($ci==10) //  reset at  prime num 11
        $ci=0;
    else
        $ci++;

    }

这个计划是否有意义 - 是否有可能通过执行所有这些操作来降低我的最终结果的安全性?我对使用时间戳数据有何想法?

提前致谢。

【问题讨论】:

  • [1,500000] + [1,500000] + [1, 9000000] 的最小值不是 1,而是 3。
  • 是的,正确!我只是用这些整数来说明我的想法。

标签: php security random


【解决方案1】:

我建议阅读RFC4086, section 5。基本上,它讨论了如何在不影响安全性或偏见的情况下“混合”不同的熵源。

简而言之,您需要一个“混合功能”。您可以使用xor 执行此操作,只需将结果设置为输入的异或:result = A xor B

xor 的问题在于,如果数字以任何方式相关,它会在结果中引入强烈的偏差。例如,如果 A 和 B 的第 1-4 位是当前时间戳,则结果的前 4 位将始终为 0。

相反,您可以使用基于加密哈希函数的更强大的混合函数。所以你可以用HMAC-SHA256(A, B)代替A xor B。这会比较慢,但也可以防止任何相关性对结果产生偏差。

这是我在RandomLib 中使用的策略。我这样做是因为不是每个系统都有每种生成方法。所以我尽可能多地提取方法,并将它们强烈混合。这样结果永远不会弱于最强的方法。

然而,我会问为什么。如果/dev/urandom 可用,您将不会比它更好。原因很简单,即使您调用 random.org 获取更多熵,您的调用也会使用从/dev/urandom 生成的随机密钥进行加密。这意味着如果攻击者可以攻破/dev/urandom,那么您的服务器就完蛋了,您将竭尽全力试图让它变得更好。

相反,只需使用 /dev/urandom 并保持您的操作系统更新...

【讨论】:

  • 感谢您的回复。如果我理解正确,假设 A 是 30234 的整数值(不是二进制),B 是 4354,$result = $a ^ $b 是 26392 - 我理解正确吗?为什么建议使用 XOR 而不是简单的加法 (30234 +4354 = 34588) ?关于您对时间戳的担忧,我已经用一个示例值更新了我的问题,而且只有 A 或 B 将来自时间戳,而不是两者 - 这是否解决了这个问题?
  • 关于我为什么要这样做,并扮演魔鬼的拥护者,在我的应用程序中,如果/dev/urandom 中存在错误,这将是一个问题,这是在我生成数字后发现的使用一段时间。
  • 即使您的应用程序针对假设的/dev/urandom 弱点进行了强化,您系统的其余部分也肯定不会。如果您担心,我会专注于查看 urandom 的工作原理并寻找错误/建议对内核进行改进。
  • @Paul 不,混合是在字节级别完成的,而不是整数级别。而且您无法对 /dev/urandom 中的错误进行强化。操作系统使用它太多了。这意味着虽然您的随机数可能是“安全的”,但操作系统不是,因此您无法知道是否有人没有查看那些“安全”的数字。因此只信任 /dev/urandom 是安全的
猜你喜欢
  • 2016-09-01
  • 1970-01-01
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 2017-06-24
相关资源
最近更新 更多