tl: dr версия:
Я ценю, что этот вопрос был задан ранее, но, похоже, нет четкого ответа и руководства о том, как использовать рекомендуемый метод.
Мне нужно создать коды случайного сброса, когда пользователь забыл свой пароль. Этот код сброса затем добавляется к URL-адресу, который им отправляется по электронной почте. Когда они нажимают на URL, код сброса и адрес электронной почты сравниваются с кодом и адресом электронной почты в базе данных, а в случае совпадения предлагается форма сброса.
Моя первая попытка создания кода проста, но достаточно ли он безопасен? Насколько легко было бы взломать? Я буду просить людей зарегистрироваться на сайте, поэтому мне нужно сделать систему безопасной.
<php?
$bytes = openssl_random_pseudo-bytes(3);
$reset_code = bin2hex($bytes);
Я видел много рекомендаций на этом сайте и другие для RandomLib https://github.com/ircmaxell/RandomLib но я не могу понять, как использовать это, и я видел, как другие боролись без руководства. Я скачал zip и добавил на свой сайт документы. Я либо получаю сообщение об ошибке «Неустранимая ошибка: класс« RandomLib \ Factory »не найден», либо когда я ссылаюсь на файл factory.php с помощью «require_once (« RandomLib \ factory.php »);» » Я получаю сообщение об ошибке «Неустранимая ошибка: require_once (): не удалось открыть обязательный файл ‘RandomLibactory.php’ (include_path = ‘.; C: \ php \ pear’)»
require_once("RandomLib\factory.php");
$factory = new RandomLib\Factory;
$generator = $factory->getMediumStrengthGenerator(8, alphabet);
Короче говоря, если RandomLib — лучший вариант, было бы полезно, если бы кто-то мог предложить руководство о том, как использовать его для новичков в положении, подобном мне. Или, если первый вариант достаточно безопасен, я оставлю все как есть.
ОБНОВИТЬ:
Как указал Нарф ниже, в функции для создания случайной строки отсутствовал второй параметр, который обеспечивает безопасность сгенерированной строки.
openssl_random_pseudo-bytes(3);
Следует читать:
openssl_random_pseudo-bytes( 3 , $cstrong );
Где второй параметр $ cstrong возвращает логическое значение, которое истинно, если оно безопасно, и ложно, если нет.
http://php.net/manual/en/function.openssl-random-pseudo-bytes.php
Перво-наперво, термин «взломать» немного неуместен. Я знаю, это звучит странно, но это очень важно для понимания проблемы. Когда вы генерируете псевдослучайные строки, вам нужно, чтобы они были непредсказуемый — в этом разница между «безопасной» случайной строкой и строкой, которая выглядит просто как случайная (то есть хэш метки времени НЕ является непредсказуемым).
Тем не менее, вы начали очень хорошо — openssl_random_pseudo_bytes()
является подходящим инструментом для вашей цели. Но, в зависимости от среды, этого может быть недостаточно (именно поэтому вы не нашли четкого ответа).
Проблема многогранна …
mcrypt_create_iv()
или чтение прямо из / dev / urandom, но последнее сложно).RandomLib существует в основном из-за перечисленных выше причин — он выберет наиболее подходящий источник случайности для вашей среды, выполнит все необходимые проверки и вызовет ошибку, если «безопасный» источник случайности не доступен.
Проблема с RandomLib заключается в том, что … я не могу помочь вам с этим, извините. Я не использовал его сам, но независимо от того, сообщения об ошибках, которые вы опубликовали, ясно показывают, что вы просто передаете неправильный путь к файлу require()
, Если вы разместили это как отдельный вопрос — он будет закрыт, потому что это считается не по теме в StackOverflow; вам просто нужно сделать это самостоятельно.
Тем не менее, PHP7 (еще не выпущен на момент написания этой статьи) теперь имеет random_bytes()
функция, которая абстрагирует все эти проблемы для вас а также есть проект, который предоставляет бэкпорт пользовательского пространства для этой функции. Это все еще бета (опять же, как я пишу это), но вы должны следовать ей и использовать ее после выпуска версии 1.0. Вот: https://github.com/paragonie/random_compat
Других решений пока нет …