как работает rand (timestamp) при работе на веб-сервере? - PullRequest
0 голосов
/ 12 февраля 2010

при изучении некоторых вещей, связанных с безопасностью, возник вопрос, что можно догадаться о генерации некоторой последовательности для rand (timestamp), запущенного в веб-сервере. Он сказал, что нашей первой целью должно быть аварийное завершение работы сервера (при условии, что сервер включится через 1 минуту), мы можем синхронизировать наш генератор с сервером, и тогда rand (временная метка), генерируемая веб-сервером, может совпадать с нашим генератором.

Я запутался, если у нас есть функция rand (timestamp), не будет ли она зависеть от системной метки времени или от метки времени работы сервера?

P.S: Задавая общий вопрос - он не зависит, если он находится в JAVA / PHP / ASP. Просто спрашиваю, как работает веб-сервер / компилятор для такого кода?

Может быть, это неясный вопрос, но я хотел бы сделать разъяснение.

Ответы [ 2 ]

3 голосов
/ 12 февраля 2010

Поведение по умолчанию для многих реализаций rand() заключается в использовании системного времени в качестве начального числа, если начальное значение не указано. Даже если это не стандартное поведение, почти гарантируется, что приложение передаст системное время srand() в качестве начального числа для рандомизации последовательности.

Итак, если вы знаете точное системное время, вы можете сгенерировать ту же последовательность, что и при удаленной системе, вызывая rand(). Несколько лет назад было совершено нападение на онлайн-казино с использованием этой методики прогнозирования случайных последовательностей.

Решение имеет два аспекта: получить начальное значение из непредсказуемого аппаратного источника (для этого есть коммерческие единицы) И использовать самый длинный из доступных генераторов псевдочисленных номеров.

Было много вопросов по SO по теме аппаратных генераторов, например:

0 голосов
/ 12 февраля 2010

rand () возвращает псевдослучайное число. Генератор псевдослучайных чисел обычно инициализируется начальным числом. Если два экземпляра псевдослучайного генератора инициализируются одним и тем же начальным числом, то они будут генерировать одинаковую последовательность при последующих вызовах rand.

При сбое сервера вы заставляете приложение инициализировать псевдослучайный генератор с текущей меткой времени Unix, поскольку именно это оно использует в качестве начального числа. Злоумышленник может легко угадать начальное число / метку времени за несколько попыток (сервер может использовать ntp, что делает его еще проще).

Вот почему не рекомендуется использовать метку времени Unix в качестве начального числа. В любом случае для криптографического использования обычно используется генератор случайных чисел, который поставляется с криптографической библиотекой. Например, Openssl имеет RAND_bytes, который делает доступными криптографически стойкие псевдослучайные байты. Во многих системах Unix этот генератор псевдослучайных чисел автоматически заполняется байтами из / dev / urandom. Подробнее см. http://www.openssl.org/docs/crypto/RAND_add.html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...