Я пытаюсь сгенерировать случайный пароль в php.
Однако я получаю все 'а' и возвращаемый тип имеет тип массив, и я хотел бы, чтобы это была строка. Любые идеи о том, как исправить код?
Спасибо.
function randomPassword() {
$alphabet = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789";
for ($i = 0; $i < 8; $i++) {
$n = rand(0, count($alphabet)-1);
$pass[$i] = $alphabet[$n];
}
return $pass;
}
/dev/random
достаточно использовать ответы , так как вопрос не требует « безопасного » пароля (и его не следует редактировать, чтобы он содержал его, так как это изменило бы значение исходного вопроса). Хотя я полностью за безопасность, я думаю, что эта ковровая бомба не была полностью продумана. Как и при использованииmysql_*
, ответы все еще действительны, но должны быть помечены как небезопасные. Возможно, это то, что SO необходимо включить в качестве дополнительного программного обеспечения - возможность предупреждать о небезопасном коде?Ответы:
Попробуйте это (используйте
strlen
вместоcount
, потому чтоcount
в строке всегда1
):Демо: http://codepad.org/UL8k4aYK
источник
$pass .= $alphabet[$n]
.mt_rand
, не лучше)openssl_random_pseudo_bytes()
используется вместоrand()
TL; DR:
random_int()
и приведенноеrandom_str()
ниже.random_int()
, используйте random_compat .Объяснение:
Поскольку вы генерируете пароль , вам нужно убедиться, что сгенерированный вами пароль непредсказуем, и единственный способ обеспечить наличие этого свойства в вашей реализации - использовать криптографически безопасный генератор псевдослучайных чисел (CSPRNG).
Требование к CSPRNG может быть смягчено для общего случая случайных строк, но не когда речь идет о безопасности.
Простой, безопасный и правильный ответ на генерацию пароля в PHP - это использовать RandomLib и не изобретать велосипед. Эта библиотека была проверена экспертами по безопасности отрасли, а также я.
Для разработчиков, которые предпочитают изобретать собственное решение, PHP 7.0.0 предоставит
random_int()
для этой цели. Если вы все еще используете PHP 5.x, мы написали полифил для PHP 5,random_int()
чтобы вы могли использовать новый API до выхода PHP 7. Использование нашегоrandom_int()
polyfill, вероятно, безопаснее, чем написание собственной реализации.С помощью надежного генератора случайных целых чисел создать безопасную случайную строку проще, чем pie:
источник
mcrypt_*
функций. В потоке проблем я вижу, что вы разветвили библиотеку из-за того, что не смогли удержать @ircmaxell, но ваш форк говорит, что сборка не удалась на Трэвисе. Хотели бы вы обновить этот ответ (который все еще довольно высок в Google)?Я знаю, что вы пытаетесь сгенерировать свой пароль особым образом, но вы можете посмотреть и на этот метод ...
Он взят с сайта php.net и создает строку, которая вдвое длиннее числа, которое вы вводите в функцию openssl_random_pseudo_bytes. Таким образом, выше будет создать пароль длиной 4 символа.
Коротко...
Создайте пароль длиной 8 символов.
Однако обратите внимание, что пароль содержит только цифры 0-9 и строчные буквы af!
источник
openssl_random_pseudo_bytes()
является мощным генератором случайных чисел с полными двоичными байтами и не требует дополнительной перестановки. Кроме того, я воспользуюсь случаем, чтобы указать, что опасно предполагать, что использование нескольких методов шифрования сделает что-либо более случайным, в некоторых случаях это может быть на самом деле противоположным из-за накопления коллизий хеширования.Крошечный код с 2 строки.
демо: http://codepad.org/5rHMHwnH
источник
substr(str_shuffle(str_repeat($chars,$length)),0,$length);
Если вы используете PHP7, вы можете использовать
random_int()
функцию:источник
mt_rand
для генерации пароля.mt_rand
, поэтому оно по-прежнему непригодно для использования в целях безопасности.$chars
В одной строке:
источник
substr(str_shuffle(str_repeat($chars,$length)),0,$length);
Энтропия восстановленаВаш лучший выбор - библиотека RandomLib от ircmaxell .
Пример использования:
Он генерирует строки, которые более строго случайны, чем обычные функции случайности, такие как
shuffle()
иrand()
(что обычно требуется для конфиденциальной информации, такой как пароли, соли и ключи).источник
rand()
илиmt_rand()
.random_bytes
), но это не делаетrand
ответы неправильными.rand
не очень хороший выбор для паролейrand()
неправильных ответов . Они неверны сами по себе!Вы хотите
strlen($alphabet)
, а неcount
постояннойalphabet
(эквивалентно'alphabet'
).Однако
rand
не подходит случайная функция для этой цели. Его вывод можно легко предсказать, так как он неявно засеян текущим временем. Дополнительно,rand
не является криптографически безопасным; поэтому относительно легко определить его внутреннее состояние по выходным данным.Вместо этого читайте,
/dev/urandom
чтобы получить криптографически случайные данные.источник
Я собираюсь опубликовать ответ, потому что некоторые из существующих ответов близки, но имеют один из:
Этот ответ обойдет
count/strlen
проблему, поскольку безопасность сгенерированного пароля, по крайней мере, ИМХО, выходит за рамки того, как вы туда попали. Я также собираюсь предположить, PHP> 5.3.0.Давайте разберем проблему на составные части, которые:
Для первой части PHP> 5.3.0 предоставляет функцию
openssl_random_pseudo_bytes
. Обратите внимание, что хотя большинство систем используют криптографически стойкий алгоритм, вы должны проверить, чтобы мы использовали оболочку:Для второй части мы будем использовать,
base64_encode
поскольку она принимает байтовую строку и создает последовательность символов, алфавит которых очень близок к алфавиту, указанному в исходном вопросе. Если мы не возражаем против этого+
,/
и=
в последней строке появляются символы, и мы хотим, чтобы результат был длиной не менее$n
символов, мы могли бы просто использовать:Этот
3/4
фактор связан с тем, что в результате кодирования base64 получается строка, длина которой как минимум на треть больше, чем строка байтов. Результат будет точным для$n
кратности от 4 до 3 символов длиннее, в противном случае. Поскольку дополнительные символы являются преимущественно символом заполнения=
, если у нас по какой-то причине было ограничение, что пароль должен быть точной длины, то мы можем усечь его до желаемой длины. Это особенно связано с тем, что для заданного значения$n
все пароли заканчиваются одинаковым числом, так что злоумышленнику, имеющему доступ к результирующему паролю, будет угадано до 2 символов меньше.Для дополнительного кредита, если бы мы хотели выполнить точную спецификацию, как в вопросе ОП, то нам пришлось бы сделать немного больше работы. Я собираюсь отказаться от базового подхода к конвертации и перейти к быстрому и грязному. Оба должны генерировать больше случайности, чем в любом случае будет использоваться в результате из-за длинного алфавита из 62 записей.
Для дополнительных символов в результате мы можем просто отбросить их из полученной строки. Если мы начнем с 8 байтов в нашей байтовой строке, то примерно 25% символов base64 будут этими «нежелательными» символами, так что простое отбрасывание этих символов приведет к тому, что строка будет не короче, чем хотел OP. Тогда мы можем просто обрезать его, чтобы получить точную длину:
Если вы генерируете более длинные пароли, символ заполнения
=
формирует все меньшую и меньшую пропорцию промежуточного результата, чтобы вы могли реализовать более узкий подход, если проблема заключается в опустошении пула энтропии, используемого для PRNG.источник
openssl_random_pseudo_bytes
может дать слабый результат. Я не осознавал, что это так.base_convert(uniqid('pass', true), 10, 36);
например.
e0m6ngefmj4
РЕДАКТИРОВАТЬ
Как я упоминал в комментариях, длина означает, что атаки методом "грубой силы" будут работать лучше, чем атаки по времени, поэтому не стоит беспокоиться о том, "насколько безопасен генератор случайных чисел". Безопасность, особенно для этого варианта использования, должна дополнять удобство использования, поэтому приведенное выше решение на самом деле достаточно хорошо для требуемой проблемы.
Однако на тот случай, если вы наткнулись на этот ответ при поиске безопасного генератора случайных строк (как я полагаю, некоторые люди основали на ответах), например, для генерации токенов, вот как будет выглядеть генератор таких кодов:
источник
Еще один (только Linux)
источник
fread()
по умолчанию буферизует до 8192 байтов, так что вы всегда будете читать это из/dev/urandom
заданного кода. Это также не будет работать в Windows. Слава за использование CSPRNG, хотя.Быть немного умнее:
проверьте это здесь .
источник
Используйте этот простой код для создания надежного пароля длиной 12
источник
Попробуйте это с заглавными буквами, маленькими буквами, цифрами и специальными символами
Пример выходных данных:
, IZCQ_IV \ 7
@wlqsfhT (д
1! 8 + 1 \ 4 @ UD
источник
rand
функция на самом деле не криптографически безопасна, поэтому может быть довольно рискованно создавать пароль с ее помощьюБыстрая Простой, чистый и последовательный формат, если это то, что вы хотите
источник
Это основано на другом ответе на этой странице, https://stackoverflow.com/a/21498316/525649
Этот ответ генерирует только шестнадцатеричные символы
0-9,a-f
. Для чего-то, что не похоже на hex, попробуйте это:base64_encode
возвращает более широкое распространение буквенно-цифровых символовrtrim
удаляет=
иногда в концеПримеры:
32eFVfGDg891Be5e7293e54z1D23110M3ZU3FMjb30Z9a740Ej0jz4
b280R72b48eOm77a25YCj093DE5d9549Gc73Jg8TdD9Z0Nj4b98760
051b33654C0Eg201cfW0e6NA4b9614ze8D2FN49E12Y0zY557aUCb8
y67Q86ffd83G0z00M0Z152f7O2ADcY313gD7a774fc5FF069zdb5b7
Это не очень настраивается для создания интерфейса для пользователей, но для некоторых целей это нормально. Увеличьте количество символов для учета отсутствия специальных символов.
источник
Назовите это как в комментариях.
источник
Я создал более полный и безопасный сценарий пароля. Это создаст комбинацию из двух прописных, двух строчных, двух цифр и двух специальных символов. Всего 8 символов.
источник
источник
Создает надежный пароль длиной 8, содержащий как минимум одну строчную букву, одну заглавную букву, одну цифру и один специальный символ. Вы можете изменить длину в коде тоже.
источник
Эта функция будет генерировать пароль на основе правил в параметрах
источник
Вот мой случайный помощник генерации простого пароля.
Это гарантирует, что пароль имеет цифры, прописные и строчные буквы, а также минимум 3 специальных символа.
Длина пароля будет от 11 до 30.
источник