Почему random_int() безопаснее, чем mt_rand()?

Почему random_int() безопаснее, чем mt_rand()?

Roman Pronskiy
  • mt_rand() всего 2^32 возможных вариантов последовательностей (инициализируется с помощью microtime())
  • random_int() от 2^128 до 2^256 вариантов последовательностей (в зависимости от особенностей используемой OS)

Можно построить базу данных, которая предсказывает первые 9 последовательностей mt_rand() из всех возможных стартовых значений (seed) и поместить это на SD карту. С этим в руках можно проследить короткую последовательность результатов mt_rand()и затем предсказать весь последующий ряд. 

В качестве иллюстрации можно взглянуть на бэкдор, который получил приз на Underhanded Crypto Contest.


Но также следует помнить, что 2^32 это верхняя граница. В действительности инициализация начального значения происходит на основе текущего времени, ID процесса и rand().

C точки зрения безопасности, текущее время вполне можно узнать. rand(), в свою очередь, тоже инициализируется из текущего времени и даты. Таким образом безопасность сводится к следующему:

  1. Смещение часов (несколько бит)
  2. Временная зона (добавляет несколько бит, но только если сервер не раскрывает ее)
  3. Идентификатор процесса (обычно значение от 0 до 65535).

То есть реальная оценка верхней границы количества возможных значений mt_rand() составляет приблизительно 20 бит. Грубо это в 3.2451855e+32 (324518550000000000000000000000000) раз меньше чем нижняя граница random_int().

Кроме того, random_int() – это криптографически безопасный генератор. То есть число возможных последовательностей не только очень большое, но и непредсказуемо распределено. Даже если вы получите в распоряжение 1 млн результатов random_int(), у вас все равно не прибавиться никакой информации о возможном следующем значении.


Оригинал: https://www.reddit.com/r/PHP/comments/a72dv4/what_threat_model_makes_random_int_more_secure/ebzzcnd/

Report Page