将其他随机数源与/ dev / urandom

时间:2015-08-05 14:32:04

标签: php security random

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

我确实意识到,对于我对项目进行编码的所有事情都是正确的,上述工具应该能够产生良好的(如随机/安全等)数据。但是,我想在混合中添加额外的随机源 - 只是在我阅读的6个月内我可以找到针对我的特定操作系统版本修补/dev/urandom(或任何其他问题)。

所以,我以为我可以从 random.org 获得数字来获得数字 fourmilab.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并设置范围如下:

A B 为1 - 500,000

U 为1 - 9,000,000

最终随机数为 A + B + U

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

之间

但是 A B 数字的数量只会包含几千,但我认为通过使用素数我可以将其扩展到数百万 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 个答案:

答案 0 :(得分:4)

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

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

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

相反,您可以使用基于加密哈希函数的更强混合函数。因此,您可以A xor B代替HMAC-SHA256(A, B)而不是/dev/urandom。这样会较慢,但也会阻止任何相关性偏离结果。

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

HOWEVER ,我会问为什么。如果/dev/urandom可用,那么你就不会变得更好。原因很简单,即使您使用random.org调用更多熵,您的呼叫也会使用/dev/urandom生成的随机密钥加密。意味着如果攻击者可以妥协/dev/urandom,那么您的服务器就是吐司,并且您将会转动轮子以试图让它变得更好。

相反,只需使用string-join( for $l in $lines return concat('"', $l, '"'), ",") 并保持操作系统更新......