Я новичок в программировании, но хочу этим заняться. Я сделал * программу проверки пароля, которая принимает вводимые пользователем данные и проверяет, действителен ли пароль или нет. На основании этого печатается ответ.
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 ответа
Два общих момента о вашем коде:
Именование переменных:
res, res2, res3
не являются описательными, поэтому с первого взгляда сложнее понять их назначение. Вместо этого я бы порекомендовал что-то похожее наcontains_digit, contains_lower_char, contains_upper_char
. Именование переменных всегда зависит от личных предпочтений, но явные имена, как правило, предпочтительнее.Условные: Способ настройки условия в вашем операторе 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, если это необходимо.
Здесь особо нечего добавить, но вы быстро обнаружите, что эта процедура слишком проста для необходимости и обычные выражения путь к успеху.
Эта процедура не гарантирует, что полученный пароль будет сбалансированный, что достаточно «случайно» и трудно угадать. Например 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
Спасибо! Это действительно полезно, я понимаю, что вы имеете в виду
— морлог
Рад помочь. Пожалуйста, пометьте вопрос как отвеченный (т. Е. Примите ответ), если ваши требования выполнены, чтобы другие участники знали, что вопрос не требует дальнейшего внимания.
— рискованный пингвин
Пожалуйста, подумайте также о том, чтобы проголосовать за этот вопрос. Если стоило ответить, то и голосование стоило. Иначе зачем вы на него ответили? 😉
— мачта