经过几天的研究和讨论,我想出了这种方法来收集访客的熵(你可以在这里看到我的研究历史)
当用户访问我运行此代码时:
$entropy=sha1(microtime().$pepper.$_SERVER['REMOTE_ADDR'].$_SERVER['REMOTE_PORT'].
$_SERVER['HTTP_USER_AGENT'].serialize($_POST).serialize($_GET).serialize($_COOKIE));
Run Code Online (Sandbox Code Playgroud)
注意:pepper是手工设置的每个站点/设置随机字符串.
然后我执行以下(我的)SQL查询:
$query="update `crypto` set `value`=sha1(concat(`value`, '$entropy')) where name='entropy'";
Run Code Online (Sandbox Code Playgroud)
这意味着我们将访客请求的熵与已经收集的其他人的熵相结合.
就这样.
那么当我们想要生成随机数时,我们将收集的熵与输出结合起来:
$query="select `value` from `crypto` where `name`='entropy'";
//...
extract(unpack('Nrandom', pack('H*', sha1(mt_rand(0, 0x7FFFFFFF).$entropy.microtime()))));
Run Code Online (Sandbox Code Playgroud)
注意:最后一行是phpseclib的crypt_rand函数的修改版本的一部分.
请告诉我您对该方案的看法以及有关熵收集/随机数生成的其他想法/信息.
ps:我知道像/ dev/urandom这样的随机源.这个系统只是一个辅助系统或(当我们没有(访问)这些来源时)一个后备方案.