Как оценивать сложность пользовательского пароля?

Рейтинг: 1Ответов: 1Опубликовано: 02.05.2023

Программа запрашивает пользовательский пароль и записывает в переменную 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()

Ответы

▲ 0

Как вариант покажу, как подсчитывать булевы значения для определения "оценки"

Все ваши переменные можно положить в список, а далее обратиться к методу 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)