Пару слов о генерации случайных чисел в PHP


Случайные числа - это неотъемлемая часть программирования, особенно если это касается систем безопасности. К примеру, криптография основывается на генерации случайных значений, для получения чисел которые невозможно предугадать. Конечно же и в PHP случайные числа играют огромную роль: с помощью них мы можем генерировать токены, соль и другие значения. Генерация случайных чисел основывается на специальных алгоритмах. Входным параметром, от которого будет отталкиваться алгоритм, может быть как случайное значение, так и заранее определённое. В этой статье мы поговорим о случайных числах: как они генерируются и где их можно задействовать. Использование случайных чисел В PHP случайные числа играют огромную роль, т.к. очень часто используются для различных целей. В основном, они связаны с безопасностью. На их основе генерируются токены CSRF, ключи API, значения для аутентификации, значения для сброса паролей и многое другое. Всё это делается, для того чтобы получаемые значение было невозможно предугадать. Самые важные примеры применения случайных значений: Генерация соли для криптографии - случайное число соли используется, как правило, для шифрования “в одну сторону”, а также для хэширования паролей. Это случайное значение используется как вектор инициализации в криптографии. Генерация случайных значений, таких как ID сессии - PHP используется для создания огромного количества приложений, где безопасность стоит на первом месте. Многий функционал базируется на работе с сессиями и сгенерированными ID сессий. Генерация токенов для аутентификации, которые практически невозможно предугадать - многие PHP приложения базируются на работе с другими системами через специальные API интерфейсы. Обычно перед использованием API нужно пройти процесс аутентификации. Получать трудно-подбираемые значения для токенов очень сложно. Именно поэтому в данных задачах используются случайные числа. Генераторы случайных чисел Случайные числа, использующиеся в случаях, описанных выше, в PHP генерируются псевдо-генераторами. Всего доступно несколько алгоритмов: Линейный конгруэнтный метод, при использовании функции lcg_value(). Вихрь Мерсенна, используется функцией mt_rand(). Функция rand(), использующая аналогичную функцию в языке Си. Фактически данные функции возвращают не случайные числа, а числа, распределённые таким образом, что они выглядят как случайные. Последовательность этих чисел зависит от базового случайного числа внутри реализованного алгоритма. Базовые числа для генераторов Базовые числа или вектора таких чисел - это наборы данных, которые используются для генерации случайных чисел. Псевдо-генераторы случайных чисел работают, только отталкиваясь от них. Если злоумышленник узнает это базовое число, то в будущем сможет предугадать значения ваших случайных чисел. В PHP вы можете задать базовые числа двумя способами. Первый - это используя функцию mt_srand(). Этот способ в основном используется при юнит тестах случайного ряда. Второй способ - это предоставление PHP право самому генерировать базовые числа. Начиная с версии 4.2, PHP предоставляет эту возможность. В последствии для генерации случайных чисел будет задействован Вихрь Мерсенна. PHP генерирует базовое число, в зависимости от операционной системы. На платформах Linux можно воспользоваться функциями mcrypt_create_iv() или openssl_pseudo_random_bytes() в /dev/urandom. Windows предоставляет специальный псевдо-генератор, к которому можно получить доступ через функции openssl_pseudo_random_bytes() и the mcrypt_create_iv(). Итог Поскольку случайные числа играют огромную роль в построении безопасных веб приложений, то нам нужно больше знать о том, как они работают. Если вы сами захотите генерировать базовые числа для псевдо-генераторов, то убедитесь в надёжности ваших методов.