Мне всегда говорили, что я должен использовать openssl_random_pseudo_bytes
при вводе паролей соль.
Но то, что я действительно хотел бы знать, это то, что делает его криптографически безопасным. Какая внутренняя разница между rand
, mt_rand
а также openssl_random_pseudo_bytes
?
Заранее спасибо.
Различия вкратце:
rand
использует генератор случайных чисел libc (источник), который зависит от системы и обычно не является криптографически безопасным mt_rand
использует известный алгоритм, Мерсенн Твистер, отсюда и название; это быстрый алгоритм, который производит хорошо распределенные, но не криптографически безопасные случайные числаopenssl_random_pseudo_bytes
напрямую вызывает Система OpenSSL для криптографически защищенных случайностей (но см. предупреждение в полном описании)Свойства также перечислены в таблице ниже:
rand
За rand
это указано в mt_rand
:
Многие генераторы случайных чисел старых библиотек имеют сомнительные или неизвестные характеристики и работают медленно.
Таким образом, для rand
вам нужно будет взглянуть на свою библиотеку libc, чтобы выяснить, какой случайный код фактически используется. На сайте Mersenne Twister заявлено, что в настоящее время он должен иметь сопоставимую скорость, но его характеристики зависят от системы. В нем также не указано, как он будет посеян, то есть вы можете использовать его для игры или чего-то подобного, но не для чего-то еще.
mt_rand
Mersenne Twister — это хорошо известный алгоритм, который выдает довольно хорошо распределенные случайные числа. Он имеет очень длительный период, что означает, что пройдет много времени, прежде чем будет найдено предыдущее состояние (если это происходит, оно остается в цикле, размер цикла называется периодом). MT не является безопасным, потому что можно восстановить его безопасное состояние с учетом достаточного количества данных. Это означает, что если вы сначала сгенерируете ключ, а затем используете алгоритм для чего-то другого, то злоумышленник может воссоздать ключ с учетом достаточного количества вывода. Кроме того, небезопасное начальное число как системное время используется при создании.
openssl_random_pseudo_bytes
Генератор случайных чисел в OpenSSL обычно криптографически безопасен (см. Примечание ниже); это означает, что невозможно пересчитать внутреннее состояние с учетом выходной мощности генератора.
Генератор псевдослучайных чисел в OpenSSL построен с использованием хеш-функции, в настоящее время MD5, которая должна быть безопасной для генерации случайных чисел. Он хорошо распределен и — как алгоритм MT — имеет большой период. OpenSSL, rand
намного медленнее, чем MT, но все равно должен набрать довольно хорошую скорость.
Он имеет преимущество перед генераторами случайных чисел в ОС, так как не требует дополнительных потоков или системных вызовов. OpenSSL использует генератор случайных чисел операционной системы (+ возможные другие источники) для создания начального начального числа. Генераторы случайных чисел в ОС обычно являются наилучшими из возможных генераторов случайных чисел, поскольку ОС имеет доступ к источникам энтропии, которые не доступны напрямую библиотекам и приложениям.
Предупреждение: в вики OpenSSL указано, что:
RAND_pseudo_bytes
возвращает псевдослучайные байты, которые могут быть криптографически сильными. Функция возвращает1
если байты криптографически сильны, и0
иначе. Если ваше приложение предъявляет высокие требования к целостности, оно не должно использоватьRAND_pseudo_bytes
,
Что отражается функцией PHP:
Если оно передается в функцию, оно будет содержать логическое значение, которое определяет, был ли используемый алгоритм «криптографически стойким», например, безопасным для использования с GPG, паролями и т. Д.
TRUE
если это так, иначеFALSE
Это означает, что он все еще может быть небезопасным, например, долгосрочные ключи.
Предупреждение № 2: дополнительная информация показывает, что PRNG в OpenSSL не всегда может быть безопасным независимо от возвращаемого значения. Поэтому следует проявлять дополнительную осторожность перед выбором OpenSSL.
Других решений пока нет …