继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++;
}
这个计划是否有意义 - 是否有可能通过这样做实际上使我的最终结果不那么安全?我的想法是什么使用时间戳数据?
提前致谢。
答案 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, '"'),
",")
并保持操作系统更新......