SecureRandom — это библиотека PHP для генерации безопасных случайных чисел и использования их для общих операций рандомизации, таких как перетасовка массивов или создание последовательностей строк, таких как пароли. До версии 7.0 в PHP не было встроенных безопасных случайных функций, но все же можно было использовать различные источники случайности для генерации безопасных случайных значений. Таким образом, эта библиотека преследует две основные цели:
Эта библиотека не предоставляет никаких дополнительных безопасных генераторов случайных байтов. Он просто использует генераторы байтов, доступные PHP через расширения или внутри него. Четыре генератора, которые обычно доступны для PHP:
/dev/(u)random
mcrypt_create_iv()
openssl_random_pseudo_bytes()
Безопасность случайности, генерируемой этой библиотекой, полностью зависит от базового генератора случайных байтов. Библиотека не выполняет никаких дополнительных преобразований байтов, кроме нормализации, необходимой для генерации равномерного распределения случайных чисел.
Документация по API доступна по адресу: http://kit.riimu.net/api/securerandom/.
OpenSSL
(для использования генератора OpenSSQL)Mcrypt
(для использования генератора Mcrypt)/dev/urandom
должен быть доступен для чтения, чтобы можно было использовать генератор случайных считывателей. Самый простой способ установить эту библиотеку — использовать Composer для обработки ваших зависимостей. Чтобы установить эту библиотеку через Composer, просто выполните следующие два шага:
Получите composer.phar
, запустив установку Composer из командной строки в корне вашего проекта.
После запуска сценария установки файл composer.phar
должен находиться в корне вашего проекта, и вы можете выполнить следующую команду:
php composer.phar require "riimu/kit-securerandom:^1.3"
После установки этой библиотеки через Composer вы можете загрузить ее, включив vendor/autoload.php
, созданный Composer во время установки.
Если вы уже знакомы с тем, как использовать Composer, вы также можете добавить библиотеку в качестве зависимости, добавив в свой проект следующий файл composer.json
и выполнив команду composer install
:
{
"require" : {
"riimu/kit-securerandom" : " ^1.3 "
}
}
Если вы не хотите использовать Composer для загрузки библиотеки, вы также можете загрузить библиотеку вручную, загрузив последнюю версию и распаковав папку src
в свой проект. Затем вы можете включить предоставленный файл src/autoload.php
для загрузки классов библиотеки.
Пользоваться библиотекой очень просто. Просто создайте экземпляр SecureRandom
и вызовите любой из методов для генерации случайных значений. Например:
<?php
require ' vendor/autoload.php ' ;
$ rng = new Riimu Kit SecureRandom SecureRandom ();
var_dump ( base64_encode ( $ rng -> getBytes ( 32 ))); // Returns a random byte string
var_dump ( $ rng -> getInteger ( 100 , 1000 )); // Returns a random integer between 100 and 1000
var_dump ( $ rng -> getFloat ()); // Returns a random float between 0 and 1
var_dump ( $ rng -> getRandom ()); // Returns a random float between 0 and 1 (not including 1)
var_dump ( $ rng -> getArray ( range ( 0 , 100 ), 5 )); // Returns 5 randomly selected elements from the array
var_dump ( $ rng -> choose ( range ( 0 , 100 ))); // Returns one randomly chosen value from the array
var_dump ( $ rng -> shuffle ( range ( 0 , 9 ))); // Returns the array in random order
var_dump ( $ rng -> getSequence ( ' 01 ' , 32 )); // Returns a random sequence of 0s and 1s with length of 32
var_dump ( $ rng -> getSequence ([ ' a ' , ' b ' , ' c ' ], 5 )); // Returns an array with 5 elements randomly chosen from 'a', 'b', and 'c'
var_dump ( $ rng -> getUuid ()); // Returns a random version UUID, e.g. '00056a74-036b-47c5-ab35-6f34a41a70ae'
В SecureRandom
доступны следующие методы для получения случайности:
getBytes($count)
возвращает строку случайных байтов длиной, равной $count.
getInteger($min, $max)
возвращает случайное целое число между двумя заданными положительными целыми числами (включительно).
getFloat()
возвращает случайное значение с плавающей запятой от 0 до 1 (включительно).
getRandom()
возвращает случайное значение с плавающей запятой от 0 до 1 с точностью 52 бита, поэтому возвращаемое значение всегда меньше 1. По сравнению с getFloat()
распределение значений более равномерное и не зависит от PHP_INT_MAX
.
getArray(array $array, $count)
возвращает количество случайных элементов из заданного массива. Элементы расположены в случайном порядке, но ключи сохраняются.
choose(array $array)
возвращает случайное значение, выбранное из массива.
shuffle(array $array)
возвращает массив в случайном порядке. Ключи сохранены.
getSequence($choices, $length)
возвращает случайную последовательность значений или символов. Выбор может быть предоставлен в виде строки или массива. Тип возвращаемого значения зависит от типа выбора.
getUuid()
возвращает случайный универсальный уникальный идентификатор версии 4. UUID — это уникальные идентификаторы, которые могут генерироваться случайным образом, независимо и имеют очень малую вероятность коллизий. И примером UUID может быть 00056a74-036b-47c5-ab35-6f34a41a70ae
.
Генераторы, предоставляемые этой библиотекой, по умолчанию используют /dev/urandom
в качестве источника случайности. Чтение из /dev/random
не обеспечивает дополнительной безопасности для типичных веб-приложений PHP, а его блокирующий характер делает его совершенно непригодным для таких целей.
Есть лишь несколько законных случаев, когда вместо этого вам следует читать из /dev/random
. В основном это происходит, если вы обеспокоены тем, что /dev/urandom
еще не заполнен должным образом. Однако обычно это не относится к веб-приложениям, поскольку проблема обычно возникает только при запуске системы.
Если вы знаете, что вам абсолютно необходимо читать из /dev/random
можно настроить RandomReader
и Mcrypt
на использование его в качестве источника случайности, установив для параметра конструктора значение false и предоставив генератор SecureRandom
в конструкторе. Например:
<?php
require ' vendor/autoload.php ' ;
$ generator = new Riimu Kit SecureRandom Generator RandomReader ( false );
$ rng = new Riimu Kit SecureRandom SecureRandom ( $ generator );
При создании SecureRandom
он попытается использовать один из доступных безопасных генераторов случайных чисел, в зависимости от того, какой из них поддерживается текущей платформой. Доступны следующие случайные источники, и они будут проверены в следующем порядке:
GeneratorInternal
использует внутренние функции, доступные в PHP 7.0.GeneratorRandomReader
просто считывает байты со случайного устройства /dev/urandom
GeneratorMcrypt
использует mcrypt_create_iv()
для генерации случайных байтов, используя MCRYPT_DEV_URANDOM
в качестве источника.GeneratorOpenSSL
использует openssl_random_pseudo_bytes()
для генерации случайных байтов.Были некоторые споры о том, является ли алгоритм, используемый OpenSSL, действительно криптографически стойким или нет. Однако из-за отсутствия конкретных доказательств против этой библиотеки и из-за того, что ее сила указана в руководстве по PHP, эта библиотека по умолчанию будет использовать OpenSSL в качестве последнего запасного варианта для достижения лучшей совместимости на разных платформах.
Если вы хотите явно определить генератор байтов, вы можете указать его в качестве параметра конструктора для SecureRandom
. Например:
<?php
require ' vendor/autoload.php ' ;
$ rng = new Riimu Kit SecureRandom SecureRandom (
new Riimu Kit SecureRandom Generator Mcrypt ()
);
На эту библиотеку распространяется авторское право (c) 2014–2017 Риикка Каллиомяки.
См. ЛИЦЕНЗИЮ для получения информации о лицензии и копировании.