Генерация паролей

Я новичок в программировании, но хочу этим заняться. Я сделал * программу проверки пароля, которая принимает вводимые пользователем данные и проверяет, действителен ли пароль или нет. На основании этого печатается ответ.

print("Create a password! Your password must have 8 to 12 digits. Numbers and lower as well as upper case letters must be a part of it!")
password = input("Enter your password:")
res = any(chr.isdigit() for chr in password)
res2 = any(chr.islower() for chr in password)
res3 = any(chr.isupper() for chr in password)
if len(password) >= 8 and len(password) <13 and res == True and res2 == True and res3 == True :
    print("Welcome!")
else:
    print("Your password is not valid!")

Есть способ более элегантный или лучший? Может быть, у вас тоже есть идеи, как расширить проект?

3 ответа
3

Два общих момента о вашем коде:

  1. Именование переменных: res, res2, res3 не являются описательными, поэтому с первого взгляда сложнее понять их назначение. Вместо этого я бы порекомендовал что-то похожее на contains_digit, contains_lower_char, contains_upper_char. Именование переменных всегда зависит от личных предпочтений, но явные имена, как правило, предпочтительнее.

  2. Условные: Способ настройки условия в вашем операторе if неоптимален. Во-первых: len(password) >= 8 and len(password) <13 можно сократить до 8 <= len(password) <= 12 или же len(password) in range(8, 13). Это более читабельно и более лаконично отражает ваши намерения. Во-вторых: вам почти никогда не понадобится == True статьи с True == True -> True и False == True -> False. Таким образом, вторую часть вашего состояния можно сократить до res and res2 and res3. Здесь также лучшие имена переменных делают функциональность вашей программы более понятной.

Чтобы избежать нескольких конкатенированных and-выражения, которые вы, вероятно, могли бы использовать что-то вроде all([len(password) in range(8, 13), res, res2, res3]), но я считаю, что это обычно снижает читаемость.

В заключение я бы предложил следующее условие if:

if 8 <= len(password) <= 12 and contains_digit and contains_lower and contains_upper:

На заметку: это не генератор паролей, а средство проверки действительности пароля. Вы можете дополнительно проверить, что пароль содержит только символы ASCII, если это необходимо.

  • Спасибо! Это действительно полезно, я понимаю, что вы имеете в виду

    — морлог

  • Рад помочь. Пожалуйста, пометьте вопрос как отвеченный (т. Е. Примите ответ), если ваши требования выполнены, чтобы другие участники знали, что вопрос не требует дальнейшего внимания.

    — рискованный пингвин

  • 5

    Пожалуйста, подумайте также о том, чтобы проголосовать за этот вопрос. Если стоило ответить, то и голосование стоило. Иначе зачем вы на него ответили? 😉

    — мачта

Здесь особо нечего добавить, но вы быстро обнаружите, что эта процедура слишком проста для необходимости и обычные выражения путь к успеху.

Эта процедура не гарантирует, что полученный пароль будет сбалансированный, что достаточно «случайно» и трудно угадать. Например AAAbbb123 или же Abcdef123 пройдет ваш тест. Это ненадежные пароли, и они могут даже быть в некоторых списках общих паролей (pwnlists), что означает, что они с меньшей вероятностью выдержат попытки грубой силы. Или как насчет Ab1 за которым следуют 5 или более пробелов? Дело в том, что действительно плохие шаблоны пройдут.

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

@riskypenguin предлагает ограничить ввод только символами ASCII. Я не уверен, что буду так поступать. Использование нестандартных струн увеличивает сложность. У вас могут быть иностранные пользователи, которые привыкли к своему родному алфавиту, например японскому. Они могут захотеть использовать свою клавиатуру в «основном режиме», не переключаясь на ASCII.

Из-за сложности многие разработчики предпочитают игнорировать эту тему и придерживаться ASCII, но см. Ниже, если вы хотите узнать больше.

В настоящее время веб-сайты обычно используют набор символов UTF-8, и это обычно справедливо для хранения баз данных. Кроме того, вы не должны хранить пароль в виде открытого текста, а хэш, как соленый хеш SHA-512, который представляет собой простой ASCII.

Наконец, ограничение длины до 12 символов — плохой выбор. Некоторые пользователи могут захотеть использовать более длинные пароли или более памятный кодовая фраза. Выбор 12 символов является произвольным и ограничивает сложность. Реальным пределом должна быть длина поля пароля в ваших HTML-формах. Да, 50 символов должно быть разумным. Но 12? Думаю, это такой 1996 год 🙂

Рекомендации:

  • 6

    Главный и очень важный момент здесь в том, что актуальный политика реализуется OP — это плохо, и уже много лет известно, что это плохо. Мне жаль пользователей, если этот код когда-нибудь попадет в производство.

    — l0b0

  • Действительно хороший пароль трудно запомнить людям? Вряд ли, как вы, кажется, намекаете позже. Видеть security.stackexchange.com/questions/6095/… Конечно, существуют системы, вводящие необоснованные ограничения в отношении длины пароля и содержимого для небезопасной работы.

    — Дедупликатор

  • 5

    «Наконец, ограничение длины до 12 символов — плохой выбор». +1 только за это.

    — бесконечное ноль

  • 2

    хранить пароль в виде открытого текста, но хеш, например соленый хеш SHA-512 нет, вам не следует этого делать. SHA — это быстрый хэш, и вы этого не хотите. Вы хотите, чтобы он был медленным, независимым от оборудования и т. Д. Для этого есть специальные хеши (PBKDF2, bcrypt, argon …)

    — WoJ

Здесь есть два отдельных вопроса, и я постараюсь ответить на оба. Вы спрашиваете, как улучшить код, который я разделю на две части: «Как я могу сделать из этого более совершенный код, который делает то же самое?» И «Как я могу сделать это лучше?».

Делаем код лучше, делая то же самое:

if len(password) >= 8 and len(password) <13 and res == True and res2 == True and res3 == True :

Здесь вы делаете «промежуточную» проверку, что на самом деле делает Python очень легко. Кроме того, вам не нужно проверять, равно ли что-то True — просто проверьте, действительно ли это. Итак, попробуйте это:

if 8 <= len(password) < 13 and res and res2 and res3:

Другие упоминали именование переменных, поэтому я кратко скажу, что согласен, и «has_lower» и так далее было бы лучше, чем «res2».

Это очень небольшая настройка пользовательского интерфейса, но я предпочитаю пробел после подсказки с двоеточием.

password = input("Enter your password:")
password = input("Enter your password: ")

Итак, перейдем к лучшим способам работы.

Простой: ознакомьтесь с Getpass модуль для лучшего способа запросить пароль у пользователя. Там, где это возможно, он замаскирует пароль или скроет его из истории, или что-то еще, подходящее для среды, в которой он находится.

Во-вторых: никогда не ограничивайте длину пароля, кроме как для удаления действительно нелепых вещей, которые на самом деле вообще не были бы паролями. Например, ограничение в 50 (как было предложено), вероятно, не проблема, но я бы пошел до 256 или более, если у вас нет чего-то, что действительно не может работать с паролями так долго. Определенно нет причин ограничивать его тринадцатью.

Если вы хотите по-настоящему изощренно, то можете рассмотреть гибрид требований к паролю банковского стиля («должен иметь по крайней мере один верхний, один нижний, одну цифру, один символ и один символ, который нельзя ввести на Клавиатура американского английского «) и гораздо более безопасные требования к длине. Разрешать Пароли в стиле XKCD 936 просто разрешив любой пароль, превышающий определенную длину. Поскольку это упражнение по программированию на Python, вот что я бы порекомендовал: дать оценку каждой категории символов, которые вы нашли (например, 26 баллов за строчную букву, еще 26 за прописную букву, 10 за цифру и т. д.), сложите все эти баллы и возведите их в степень длины пароля. Это достойный способ оценить сложность пароля, хотя он никогда не будет идеальным (пароли XKCD 936 чрезвычайно сложно оценить справедливо, если вы не знаете исходный список слов); затем вы можете поиграть с ним и посмотреть, какой длины должен быть пароль из чисто строчных букв ASCII, чтобы получить оценку, а также пароль, более сложный для банка. ПОДСКАЗКА: Это далеко не так долго, как подсказывает интуиция многих людей.

Если вы действительно хотите ввести пароль поколение, в отличие от Проверка, Я бы порекомендовал посмотреть модуль секретов, в котором есть множество инструментов, которые вам помогут.

Удачи!

если у вас нет чего-то, что действительно не может работать с паролями так долго обычно это плохие новости. Когда длина пароля ограничена, я всегда с большим подозрением отношусь к тому, как с ним обращаются. Наличие пароля размером 1 МБ не должно быть проблемой. С 1 ГБ вы можете столкнуться с некоторыми проблемами тайм-аута и производительностью, но никогда с проблемами безопасности. (примеры паролей размером 1 МБ или 1 ГБ, конечно, преувеличены)

— WoJ

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *