Что делает openssl случайные псевдобайты "криптографически безопасными"?


Мне всегда говорили, что я должен использовать openssl_random_pseudo_bytes, когда даю паролям соль.

Но что я действительно хотел бы знать, так это то, что делает его криптографически безопасным. В чем заключается внутренняя разница между rand, mt_rand и еще openssl_random_pseudo_bytes?

Заранее благодарю.

1 6

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, имеет высокий период. OpenSSL rand намного медленнее, чем MT, но он все равно должен получить довольно хорошую скорость.

У него есть преимущество перед генераторами случайных чисел OS, что ему не нужны дополнительные потоки или система звонки. OpenSSL использует генератор случайных чисел операционной системы (+ возможные другие источники) для создания начального семени. Генераторы случайных чисел ОС обычно являются наилучшими из возможных генераторов случайных чисел, так как ОС имеет доступ к источникам энтропии, недоступным непосредственно библиотекам и приложениям.

Предупреждение : на Вики OpenSSL указано, что:

RAND_pseudo_bytes возвращает псевдослучайные байты, которые могут быть криптографически сильными. Функция возвращает 1, если байты криптографически сильны, и 0 в противном случае. Если ваше приложение имеет высокие требования к целостности, оно не должно использовать RAND_pseudo_bytes.

Который отражается функцией PHP:

При передаче в функцию это будет содержать логическое значение, определяющее, был ли используемый алгоритм "криптографически сильным", например, безопасным для использования с GPG, паролями и т. д. TRUE если да, то в противном случае FALSE

Это означает, что он все еще может будьте небезопасны, например, для долгосрочных ключей.

Предупреждение №2 : дополнительное понимание показывает, что PRNG OpenSSL не всегда может быть безопасным независимо от возвращаемого значения. Поэтому перед выбором OpenSSL следует проявить дополнительную осторожность.