Выполняя некоторые исследования openssl_random_pseudo_bytes () в PHP, я заметил, что в реализации функции openssl_random_pseudo_bytes () в исходном коде PHP. OpenSSL, RAND_pseudo_bytes Функция используется для генерации возвращаемого значения в отличие от RAND_bytes также доступен в OpenSSL.
Документация OpenSSL об этих двух функциях такова:
RAND_pseudo_bytes () помещает num псевдослучайных байтов в buf.
Псевдослучайные байтовые последовательности, сгенерированные RAND_pseudo_bytes (), будут
уникальны, если они имеют достаточную длину, но не обязательно
непредсказуемы. Они могут быть использованы в некриптографических целях и для
определенные цели в криптографических протоколах, но обычно не для ключа
поколение и т. д.RAND_bytes () ставит num криптографически сильные псевдослучайные байты
в buf. Ошибка возникает, если PRNG не был засеян с достаточным количеством
случайность для обеспечения непредсказуемой последовательности байтов.
Я предполагаю, что мой вопрос заключается в том, почему не использовался RAND_bytes или почему в PHP нет функции openssl_rand_bytes (), если она, согласно OpenSSL, более случайна.
Просто любопытно. Это была проблема скорости? Не достаточно надежный? Или проблема была в PRNG (то есть: трудно реализовать, когда псевдо работает нормально для большинства целей)?
Спасибо
Вероятно, выбор был сделан на основе практичности, а не надежности крипто. Если RAND_bytes()
Если функция используется, функция может перестать работать из-за недостаточной доступности случайности. Автор PHP-кода, несомненно, хотел избежать сбоя функции PHP.
Я заметил, что openssl_random_pseudo_bytes()
функция имеет дополнительный crypto_strong
параметр, который позволяет вызывающей стороне узнать, были ли возвращенные байты действительно криптографически сильными, по мнению OpenSSL.
Кроме того, можно настроить OpenSSL с внешними механизмами, и некоторые из них (например, CHIL) используют аппаратный случайный источник для обоих RAND_pseudo_bytes()
а также RAND_bytes()
если это то, что вам нужно.
Также в Windows используется код PHP CryptGenRandom
.
Других решений пока нет …