после нескольких дней исследований и обсуждений я придумал этот метод для сбора энтропии от посетителей (вы можете увидеть историю моего исследования здесь)
когда пользователь посещает я запускаю этот код:
$entropy=sha1(microtime().$pepper.$_SERVER['REMOTE_ADDR'].$_SERVER['REMOTE_PORT'].
$_SERVER['HTTP_USER_AGENT'].serialize($_POST).serialize($_GET).serialize($_COOKIE));
примечание:перец - это случайная строка для каждого сайта/установки, заданная вручную.
Затем я выполняю следующий (Мой)SQL-запрос :
$query="update `crypto` set `value`=sha1(concat(`value`, '$entropy')) where name='entropy'";
, что означает, что мы объединяем энтропию запроса посетителя с уже собранными другими.
Вот и все.
затем, когда мы хотим сгенерировать случайные числа, мы объединяем собранную энтропию с выходом:
$query="select `value` from `crypto` where `name`='entropy'";
//...
extract(unpack('Nrandom', pack('H*', sha1(mt_rand(0, 0x7FFFFFFF).$entropy.microtime()))));
note:последняя строка является частью модифицированной версии функции crypt_rand phpseclib .
расскажите, пожалуйста, ваше мнение о схеме и другие идеи/информацию о сборе энтропии/генерации случайных чисел.
ps:Я знаю об источниках случайности, таких как /dev/urandom. эта система является просто вспомогательной системой или (, когда у нас нет (доступа к)этим источникам), резервной схемой.