Как написать функцию python, чтобы проверять, является ли ввод пароля пользователем ненадежным? - PullRequest
0 голосов
/ 14 июля 2020

Мне нужно написать код для назначения, которое будет принимать пароль пользователя (в виде строки) и позволяет пользователю узнать, какие элементы ввода делают пароль слабым.

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

пока что код, который я написал, выглядит следующим образом:

    size = len(password)
    
    if size < 8:
        print('not long enough')
    
    if password.isalnum():
        pass
    else:

    for x in password:
        if x.isupper():
            pass
        else:
            print('no upper case')
    
    for y in password:
        if y.islower():
            pass
        else:
            print('no lower case')
            
    return

Я внес некоторые изменения и использовал оператор .isalnum после того, как мой тестовый прогон вернул несколько строк «без верхнего регистра» и «без нижнего регистра».

Я был бы очень признателен, если бы кто-нибудь подтолкнул меня в правильном направлении, как это меня немного смутило

Ответы [ 4 ]

0 голосов
/ 14 июля 2020

Множество python средств проверки паролей в Интернете, например: https://www.geeksforgeeks.org/password-validation-in-python/

Вот быстрая консольная программа, которую вы можете вызвать, например:

$ python3 password_checker.py "Testf7788790##$"
Testing password:  Testf7788790##$
Password is valid:  True
$ python3 password_checker.py "insecurePassword"
Testing password:  insecurePassword
Password should contain at least one number
Password is valid:  False

Содержание из password_checker.py:

#!/usr/bin/python

import sys

def password_check(passwd):
    symbols = ['!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '_', '+', '=']
    isValid = False
      
    if len(passwd) < 10:
        print('Password should be at least 10 characters')
    elif not any(char.isdigit() for char in passwd):
        print('Password should contain at least one number')
    elif not any(char.isupper() for char in passwd):
        print('Password should contain at least one uppercase character')
    elif not any(char.islower() for char in passwd):
        print('Password should contain at least one lowercase character')
    elif not any(char in symbols for char in passwd):
        print('Password should contain at least one special character from list: ', symbols)
    else:
      isValid = True

    return isValid

arguments = sys.argv
if len(arguments) < 2:
    print('No password could be parsed by argv')
    valid_password = False
else:
    password = arguments[1]
    print('Testing password: ', password)
    valid_password = password_check(password)

print('Password is valid: ', valid_password)
0 голосов
/ 14 июля 2020

Я бы предпочел go с регулярным выражением.

In [122]: def validate(password):
     ...:     return True if re.match("(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}", password) else False
     ...:

In [123]: validate("helloas")
Out[123]: False

In [124]: validate("helH12asfgvGh")
Out[124]: True
0 голосов
/ 14 июля 2020

(Другие ответы уже дали вам хорошие ответы, так что это не полный ответ, это просто объяснение того, что происходит не так.) Область вашего кода, которая вызывает проблему:

for x in password:
        if x.isupper():
            pass
        else:
            print('no upper case')
for y in password:
        if y.islower():
            pass
        else:
            print('no lower case')

Вы просматриваете весь пароль в цикле, проверяете, является ли каждый символ прописным, а затем выводите «без верхнего регистра», если это не так. Проблема в том, что если один символ слова не является прописным, «that_character_that_isn't_uppercase» .isupper () вернет false и напечатает сообщение об ошибке. Например, пароль PaSSWORD вернет один «без верхнего регистра», поскольку «a» .isupper () имеет значение False. Пароль passworD вернет 7 символов «без верхнего регистра», поскольку все символы p, a, s, s, w, o, r - строчные. То же самое происходит с тестом x.islower (), вы видите, является ли каждый отдельный символ строчным. Я бы реализовал что-то вроде этого:

#password.islower() will return true if all the entire string is lowercase(and thus not uppercase)
if password.islower():
    print("No upper case")
elif password.isupper():
    print("No lower case")
#Again, password.isupper() sees if all letters are uppercase(which means that there is no lowercase letters).

Надеюсь, это помогло!

0 голосов
/ 14 июля 2020

Без регулярного выражения вы можете использовать any и str.isnumeric

if not any(map(str.isnumeric, password):
    print('No numbers')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...