Сбор энтропии в веб-приложениях для создания (более)безопасных случайных чисел

после нескольких дней исследований и обсуждений я придумал этот метод для сбора энтропии от посетителей (вы можете увидеть историю моего исследования здесь)

когда пользователь посещает я запускаю этот код:

$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. эта система является просто вспомогательной системой или (, когда у нас нет (доступа к)этим источникам), резервной схемой.

12
задан TMS 3 April 2012 в 17:52
поделиться