Почему random_int() безопаснее, чем mt_rand()?
Roman Pronskiymt_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(), в свою очередь, тоже инициализируется из текущего времени и даты. Таким образом безопасность сводится к следующему:
- Смещение часов (несколько бит)
- Временная зона (добавляет несколько бит, но только если сервер не раскрывает ее)
- Идентификатор процесса (обычно значение от 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/