Как оценивать сложность пользовательского пароля?
Программа запрашивает пользовательский пароль и записывает в переменную password.
Необходимо посчитать сложность пароля, где за каждую пройденную проверку пароль получает +1 балл до итоговой оценки, максимальное количество баллов – 5
Проверки:
- Длина пароля больше или равна 8 символам.
- В пароле есть хотя бы одна цифра
- В пароле есть хотя бы одна заглавная буква
- В пароле есть хотя бы одна строчная буква
- В пароле есть хотя бы один специальный символ
+, -, /, _, % и т.д.(их на самом деле больше)
После всех проверок нужно вывести пользователю количество баллов за пароль, а также рекомендации по улучшению пароля.
Частично задачу решил. Не могу решить вопрос с оценкой от 1 до 5
password = input('Введите пароль: ')
is_numeric = False
is_upper = False
is_lower = False
is_spec = False
if len(password) < 8:
print('Минимальное количество символов 8')
exit()
for char in password:
if char.islower():
is_lower = True
if not is_lower:
print("добавить маленькую букву")
for char in password:
if char.isupper():
is_upper = True
if not is_upper:
print("добавить большую букву")
for char in password:
if char in "@#%&()$*?:;№!<>./,":
is_spec = True
if not is_spec:
print("добавить спецсимвол")
for char in password:
if char.isdigit():
is_numeric = True
if not is_numeric:
print("добавить цифру")
exit()
Ответы (2 шт):
Без кардинальных изменений вашего кода - просто добавим счетчик и объединим условия последовательно:
password = input('Введите пароль: ')
is_numeric = False
is_upper = False
is_lower = False
is_spec = False
counter = 0
if len(password) < 8:
print('Минимальное количество символов 8')
else:
counter += 1
for char in password:
if char.islower():
is_lower = True
if not is_lower:
print("добавить маленькую букву")
else:
counter += 1
for char in password:
if char.isupper():
is_upper = True
if not is_upper:
print("добавить большую букву")
else:
counter += 1
for char in password:
if char in "@#%&()$*?:;№!<>./,":
is_spec = True
if not is_spec:
print("добавить спецсимвол")
else:
counter += 1
for char in password:
if char.isdigit():
is_numeric = True
if not is_numeric:
print("добавить цифру")
else:
counter += 1
print(f'Оценка общей сложности пароля: {counter}')
Также убраны ненужные exit()
Как вариант покажу, как подсчитывать булевы значения для определения "оценки"
Все ваши переменные можно положить в список, а далее обратиться к методу sum(). Поскольку для арифметических операций True равен 1, а False равен 0, тогда на выходе вы будете иметь сколько True у вас есть в списке. Прибавив единицу, получите желаемый результат. И так, в вашем коде
...
is_numeric = False
is_upper = False
is_lower = False
is_spec = False
... # ваша логика
estimate = sum([is_numeric, is_upper, is_lower, is_spec]) + 1
И небольшой бонус, как провернуть ваши проверки через регулярные выражения
import re
password = input('Введите пароль: ')
if len(password) < 8:
print('Минимальное количество символов 8')
exit()
validate = {
"is_numeric" : re.search(r"\d", password) is not None,
"is_upper" : re.search(r"[A-Z]", password) is not None,
"is_lower" : re.search(r"[a-z]", password) is not None,
"is_spec" : re.search(r"[@#%&()$*?:;№!<>./,]", password) is not None
}
estimate = sum(validate.values()) + 1
Относительно моего кода, рекомендации по паролю можно сделать таким образом
recommendations = {
"is_numeric" : "добавить цифру",
"is_upper" : "добавить большую букву",
"is_lower" : "добавить маленькую букву",
"is_spec" : "добавить спецсимвол",
}
if estimate < 5:
result = "Рекомендации по паролю:\n"
for key, value in validate.items():
if not value:
result += recommendations[key] + "\n"
print(result)