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