Когда пользователь на нашем сайте теряет свой пароль и отправляется на страницу «Потерянный пароль», нам нужно дать ему новый временный пароль. Я не против того, насколько это случайно, или, если оно соответствует всем «необходимым» правилам надежного пароля, все, что я хочу сделать, это дать им пароль, который они могут изменить позже.
Приложение представляет собой веб-приложение, написанное на C #. поэтому я думал о том, чтобы быть злым и идти по простому пути использования части Guid. т.е.
Guid.NewGuid().ToString("d").Substring(1,8)
Suggesstions? мысли?
Ответы:
Там всегда
System.Web.Security.Membership.GeneratePassword(int length, int numberOfNonAlphanumericCharacters
) .источник
ASP.NET Core
?Это дает преимущество в том, что вы можете выбирать из списка доступных символов для сгенерированного пароля (например, только цифры, только верхний или только нижний регистр и т. Д.)
источник
Random
не криптографически безопасен;System.Security.Cryptography.RNGCryptoServiceProvider
это лучший выбор.Основные цели моего кода:
Первое свойство достигается путем принятия 64-битного значения по модулю размера алфавита. Для маленьких алфавитов (таких как 62 символа из вопроса) это приводит к незначительному смещению. Второе и третье свойство достигается использованием
RNGCryptoServiceProvider
вместоSystem.Random
.(Это копия моего ответа на Как я могу генерировать случайные 8 буквенно-цифровые строки в C #? )
источник
(Вы также можете иметь класс, в котором этот метод живет, реализовать IDisposable, содержать ссылку на
RNGCryptoServiceProvider
и удаляющий его должным образом, чтобы избежать повторного создания его экземпляра.)Было отмечено, что, поскольку это возвращает строку base-64, выходная длина всегда кратна 4, при этом дополнительный пробел используется
=
в качестве символа заполнения.length
Параметр определяет длину байт буфера, а не выходной строки (и поэтому , возможно , не лучшее название для этого параметра, теперь я думаю об этом). Это контролирует, сколько байтов энтропии будет иметь пароль. Однако, поскольку base-64 использует 4-символьный блок для кодирования каждых 3 байтов ввода, если вы попросите длину, не кратную 3, будет некоторый дополнительный «пробел», и он будет использоваться=
для заполнения дополнительно.Если по какой-либо причине вам не нравится использование строк base-64, вы можете заменить
Convert.ToBase64String()
вызов либо преобразованием в обычную строку, либо любым изEncoding
методов; например.Encoding.UTF8.GetString(tokenBuffer)
- просто убедитесь, что вы выбрали набор символов, который может представлять полный диапазон значений, выходящих из ГСЧ, и который создает символы, совместимые с тем, куда вы отправляете или храните это. Например, использование Юникода дает много китайских символов. Использование base-64 гарантирует широко совместимый набор символов, и характеристики такой строки не должны сделать ее менее безопасной, если вы используете приличный алгоритм хеширования.источник
Это намного больше, но я думаю, что это выглядит немного более полным: http://www.obviex.com/Samples/Password.aspx
источник
Я знаю, что это старая ветка, но у меня есть то, что может быть довольно простым решением для кого-то, чтобы использовать. Легко реализовать, легко понять и легко проверить.
Рассмотрим следующее требование:
Следующее регулярное выражение может проверить этот случай:
Это выходит за рамки этого вопроса - но регулярное выражение основано на предвкушении / предвзятости и обходных путях .
Следующий код создаст случайный набор символов, которые соответствуют этому требованию:
Чтобы выполнить вышеуказанное требование, просто позвоните по следующему номеру:
Код начинается с недопустимого символа (
"!"
), поэтому длина строки может быть введена новыми символами.Затем он переходит от 1 до необходимого количества символов в нижнем регистре и на каждой итерации выбирает случайный элемент из списка в нижнем регистре и вставляет его в произвольное место в строке.
Затем он повторяет цикл для прописных букв и цифр.
Это возвращает вам строки длины =,
lowercase + uppercase + numerics
в которые строчные, прописные и числовые символы нужного вам числа были расположены в случайном порядке.источник
System.Random
для безопасности важные вещи, такие как пароли. ИспользованиеRNGCryptoServiceProvider
lowers[random.Next(lowers.Length - 1)].ToString()
Этот код никогда не сгенерирует «z». random.Next производит целые числа меньше, чем предоставленное число, поэтому вы не должны вычитать этот дополнительный из длины.Для такого рода паролей я склонен использовать систему, которая может генерировать более легко «используемые» пароли. Короткий, часто составленный из произносимых фрагментов и нескольких чисел, и без двусмысленности между символами (это 0 или O? A 1 или I?). Что-то вроде
(Напечатано прямо в браузере, поэтому используйте только в качестве руководства. Также добавьте больше слов).
источник
Мне не нравятся пароли, которые создает Membership.GeneratePassword (), так как они слишком уродливы и содержат слишком много специальных символов.
Этот код генерирует не слишком уродливый 10-значный пароль.
Конечно, я мог бы использовать Regex, чтобы сделать все замены, но это более читаемый и обслуживаемый IMO.
источник
Я создал этот класс, который использует RNGCryptoServiceProvider, и он гибкий. Пример:
источник
Я создал этот метод похож на доступный в членстве провайдера. Это полезно, если вы не хотите добавлять веб-ссылку в некоторых приложениях.
Работает отлично.
источник
System.Random
для безопасности важные вещи, такие как пароли. ИспользованиеRNGCryptoServiceProvider
Я всегда был очень доволен встроенным в KeePass генератором паролей. Поскольку KeePass - это программа .Net с открытым исходным кодом, я решил немного покопаться в коде. В итоге я просто сослался на KeePass.exe, копию, предоставленную при стандартной установке приложения, в качестве ссылки в моем проекте и написал код ниже. Вы можете увидеть, насколько он гибок благодаря KeePass. Вы можете указать длину, какие символы включать / не включать и т. Д ...
источник
источник
Я добавлю еще один опрометчивый ответ в банк.
У меня есть случай, когда мне нужны случайные пароли для связи машина-машина, поэтому у меня нет требований к удобочитаемости. У меня также нет доступа к
Membership.GeneratePassword
моему проекту, и я не хочу добавлять зависимость.Я совершенно уверен,
Membership.GeneratePassword
что делаю что-то похожее на это, но здесь вы можете настроить пулы персонажей для рисования.И некоторые примеры вывода:
Для предотвращения жалоб на использование
Random
: Основным источником случайности по-прежнему остается крипто-ГСЧ. Даже если вы могли бы детерминировано предопределять последовательность , выходящую изRandom
(говорят , что это производится только1
) вы еще не знаете , следующий символ , который будет определен (хотя бы ограничить диапазон возможностей).Одним из простых расширений было бы добавление взвешивания к различным наборам символов, которое может быть таким же простым, как повышение максимального значения и добавление падежных падежей для увеличения веса.
Для более гуманистического генератора случайных паролей я однажды реализовал систему подсказок, использующую список слов EFF .
источник
Мне нравится смотреть на генерацию паролей, как генерацию программных ключей. Вы должны выбрать из массива символов, которые следуют хорошей практике. Возьмите ответ @ Radu094 и измените его, чтобы следовать хорошей практике. Не помещайте каждую букву в массив символов. Некоторые письма сложнее сказать или понять по телефону.
Вам также следует рассмотреть возможность использования контрольной суммы для сгенерированного пароля, чтобы убедиться, что он был сгенерирован вами. Хороший способ сделать это - использовать алгоритм LUHN .
источник
Вот то, что я собрал быстро.
источник
Я использую этот код для генерации пароля с балансным составом алфавитных, числовых и не_альфа_нумеров.
источник
Это коротко, и это прекрасно работает для меня.
источник
На моем сайте я использую этот метод:
Отредактируйте строку
_SymbolsAll
для вашего списка массивов.источник
Добавлен дополнительный код к принятому ответу. Он улучшает ответы только с помощью Random и позволяет использовать некоторые параметры пароля. Мне также понравились некоторые варианты ответа KeePass, но я не хотел включать исполняемый файл в мое решение.
Это была первая ссылка, когда я искал генерацию случайных паролей, и следующее не относится к текущему вопросу, но может быть важным для рассмотрения.
System.Web.Security.Membership.GeneratePassword
это криптографически безопасно, с минимум 20% символов являются не алфавитно-цифровыми.источник
validChars может быть любой конструкцией, но я решил выбрать на основе диапазонов кода ascii, удаляя контрольные символы. В этом примере это строка из 12 символов.
источник
источник
Random
как статичныйЭтот пакет позволяет вам генерировать случайный пароль, в то же время свободно указывая, какие символы он должен содержать (при необходимости):
https://github.com/prjseal/PasswordGenerator/
Пример:
источник
Если вы хотите использовать криптографически безопасную генерацию случайных чисел, используемую System.Web.Security.Membership.GeneratePassword, но также хотите ограничить набор символов буквенно-цифровыми символами, вы можете отфильтровать результат с помощью регулярного выражения:
источник
источник
Вставьте Timer: timer1, 2 кнопки: button1, button2, 1 textBox: textBox1 и comboBox: comboBox1. Убедитесь, что вы объявили:
Исходный код:
источник
System.Random
для безопасности.