Что делает 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 следует проявить дополнительную осторожность.
