после нескольких дней исследований и обсуждений я придумал этот метод для сбора энтропии от посетителей (вы можете увидеть историю моих исследований здесь)
когда пользователь посещает, я запускаю этот код:
$entropy=sha1(microtime().$pepper.$_SERVER['REMOTE_ADDR'].$_SERVER['REMOTE_PORT'].
$_SERVER['HTTP_USER_AGENT'].serialize($_POST).serialize($_GET).serialize($_COOKIE));
note: pepper - это случайная строка для каждого сайта/установки, заданная вручную.
тогда я выполняю следующий (My) 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. эта система является лишь вспомогательной системой или (когда у нас нет (доступа к) этих источников) резервная схема.