Сгенерировать одноразовый токен в PHP: random_bytes или openssl_random_pseudo_bytes?

Мне нужно сгенерировать одноразовый токен в PHP. Есть две функции, которые я могу использовать для этого, которые, кажется, делают то же самое:random_bytes а такжеopenssl_random_pseudo_bytes, Например, используяrandom_bytes:

var_dump(bin2hex(random_bytes(12)));

--> string(24) "338f489ec37a2c2b4943905d"

и используяopenssl_random_pseudo_bytes:

var_dump(bin2hex(openssl_random_pseudo_bytes(12)));

--> string(24) "1c7febea20029bd524fba8e7"

openssl_random_pseudo_bytes PHP 5.3 и выше (поэтому я предполагаю, что это было дольше), иrandom_bytes это PHP 7. Я использую PHP 7, поэтому я могу использовать любой.

Так есть ли существенная (или незначительная в этом отношении) разница между ними? Если нет, я испытываю желание пойти сrandom_bytes просто потому, что у него более простое имя (= код, который легче читать).

 Charlotte Dunois02 авг. 2016 г., 11:30
Там нет никаких реальных отличий.
 frz399302 авг. 2016 г., 11:42
Насколько я знаю, как байты генерируютсяrandom_bytes зависит от платформы, но для другого потребуется расширение openssl.
 Charlotte Dunois02 авг. 2016 г., 12:08
@decezerandom_bytes — Generates cryptographically secure pseudo-random bytes Хм ...
 deceze02 авг. 2016 г., 12:16
@Mjh Это один очень специфический сценарий для использования случайных чисел ... но есть множество других сценариев, которые не решаются этим методом. Не уверен, в чем ваша точка зрения ...?
 Mohammad Alabed02 авг. 2016 г., 11:41
Я не советую вам больше использовать openssl .. многие советники по безопасности сообщают мне, чтобы я прекратил использовать openSSL
 Darragh Enright02 авг. 2016 г., 11:53
Немного интересной информации оopenssl_random_pseudo_bytes Вот:paragonie.com/blog/2015/07/...
 Darragh Enright02 авг. 2016 г., 11:48
Вотrandom_bytes RFC за что это стоит. Это не говорит о многомopenssl_random_pseudo_bytes() хоть. Хотя был PHPошибка безопасности в прошлом году это повлияло на 5.6. Это может быть не актуально, если вы используете PHP7.
 deceze02 авг. 2016 г., 12:09
@Charlotte Шутка в том, чтоopenssl_random_pseudo_bytes небезопасный ...
 Mjh02 авг. 2016 г., 12:09
Давайте посмотрим на проблему:Мне нужно сгенерировать одноразовый токен в PHP, Как вы можете определить, что токены, сгенерированные ранее, не использовались? Сохраняя их в БД, а затем сравнивая - это занимает время и пространство. Наилучшим подходом является использование одного из алгоритмов, разработанных для этой конкретной цели (rfc4226, rfc6238), или просто использование возрастающего числа, которое вы шифруете и передаете зашифрованное значение. Как только токен прибудет, расшифруйте его, прочитайте номер, проверьте, больше ли он того, что вы сохранили - если да, токен действителен, в противном случае обнаруживается повтор, если расшифровка не удалась - недействительный токен.
 Charlotte Dunois02 авг. 2016 г., 12:10
@deceze Хорошо, я подумал, так как он из OpenSSL, он должен быть безопасным. Никогда не использовал его и не читал страницу руководства. Похоже, OpenSSL надо разобраться: D
 Mjh02 авг. 2016 г., 12:17
@ deceze моя точка зрения в том, что я предоставил альтернативное решение для реальной проблемы. Это не имеет ничего общего со случайными числами.

Ответы на вопрос(3)

Решение Вопроса

openssl_random_pseudo_bytes является частью расширения OpenSSL, которое должно быть явнонастроен и включен в процессе компиляции PHP и требует внешних зависимостей.

random_bytes впервые появился в PHP 7 как родной всегда доступный метод PHP для генерации случайных байтов, который выбирает свой внутренний источник случайности в зависимости от платформы, на которой он работает.

Основная причина введенияrandom_bytes было то, что генерация псевдослучайных данных всегда была немного головной болью в PHP, требуя от разработчиков быть осведомленной о платформе и, возможно, использовать несколько различных резервных методов в зависимости от того, какие расширения или функции системного уровня доступны. Это часто приводило к ошибкам в отдельных реализациях, что особенно касается кода, связанного с безопасностью.random_bytes упрощает это, предоставляя одну функцию, которая всегда доступна и использует наилучший из возможных источников случайности. Если вы можете ориентироваться исключительно на PHP 7+, это должен быть ваш метод перехода.

random_bytes : Генерируеткриптографически безопасный псевдослучайные байтыopenssl_random_pseudo_bytes : Генерировать псевдослучайную строку байтов

так что главное отличиекриптографически безопасный

PHP-функция openssl_random_pseudo_bytes () вызывает функцию OpenSSL RAND_psuedo_bytes (), которую, по словам документации OpenSSL, следует использовать только в некриптографических целях:

https://paragonie.com/blog/2015/07/how-safely-generate-random-strings-and-integers-in-php

 SilverlightFox02 авг. 2016 г., 12:27
crypto_strong Выходной параметр указывает, возвращал ли метод openssl криптографически безопасную строку или нет (в зависимости от платформы).
 Mohammad Alabed02 авг. 2016 г., 13:50
вы правы .. но я все еще не предлагаю это из-за проблем безопасности, о которых сообщалось на последней конференции php в Стамбуле PHPKonfphpkonf.org (Александр Макаров)

криптографическая небезопасность в openssl_random_pseudo_bytes была исправлена ​​в 2016 году. Подробнее здесь:

http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-8867

Теперь он использует RAND_bytes, что OpenSSL рекомендует в своей вики:

https://wiki.openssl.org/index.php/Random_Numbers#FIPS_Mode

Ваш ответ на вопрос