После того как пользователь ввёл свои данные в требуемом формате, можно позаботиться и о пароле.
Напишите функцию password_validation
, которая принимает один позиционный параметр — пароль, и следующие именованные параметры:
min_length
— минимальная длина пароля, по умолчанию 8;possible_chars
— строка символов, которые могут быть в пароле, по умолчанию латинские буквы и цифры;at_least_one
— функция возвращающая логическое значение, по умолчаниюstr.isdigit
.
Если переданный позиционный параметр не является строкой, вызовите исключение TypeError
.
А так же реализуйте собственные исключения:
MinLengthError
— вызывается, если пароль меньше заданной длины;PossibleCharError
— вызывается, если в пароле используется недопустимый символ;NeedCharError
— вызывается, если в пароле не найдено ни одного обязательного символа.
Проверка условий должна происходить в порядке указанном в задании.
Так как, хороший разработчик никогда не хранит пароли в открытом виде, функция, в случае успешного завершения, возвращает хеш пароля. Для этого воспользуйтесь функцией sha256
из пакета hashlib
и верните его шестнадцатеричное представление.
В решении не должно быть вызовов требуемых функций.
Пример
Ввод
print(password_validation("Hello12345"))
Вывод
67698a29126e52a6921ca061082783ede0e9085c45163c3658a2b0a82c8f95a1
Ввод
print(password_validation(
"$uNri$e_777",
min_length=6,
at_least_one=lambda char: char in "!@#$%^&*()_"
))
Вывод
Вызвано исключение PossibleCharError
Решение
Продолжение серии задач на валидацию пользовательских данных.
По сути простая задача:
Проверяем передали ли нам строку, если нет, вызываем исключение.
Проверяем длину, если меньше заданого значения, вызываем исключение.
Проверяем все ли символы имеют допустимое значение, если нет – вызываем исключение.
Проверяем есть ли среди символов символ из списка обязательных, если нет – вызываем исключение.
Это можно сделать как через проверку наличия ключа в словаре, так и через попытку получить данные с использованием try/except. Если что-то пошло не так, вызываем исключение KeyError. В противном случае, проверям с помощью функции name_validation правильность имени и фамилии, а с помощью username_validation – имя учетной записи.
По окончании всех проверок с помощью функций модуля hashlib генерируем и возвращаем hash пароля.
Посмотреть код
Решение
import hashlib
class MinLengthError(Exception):
pass
class PossibleCharError(Exception):
pass
class NeedCharError(Exception):
pass
possible_password_chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
def password_validation(password, min_length=8,
possible_chars=possible_password_chars,
at_least_one=str.isdigit) -> str:
if not isinstance(password, str):
raise TypeError
if len(password) < min_length:
raise MinLengthError
if any([char not in possible_chars
for char in password]):
raise PossibleCharError
if not any([at_least_one(char) for char in password]):
raise NeedCharError
hash_object = hashlib.sha256()
hash_object.update(password.encode())
hash = hash_object.hexdigest()
return hash
Подскажите пожалуйста, почему это решение не проходит
import hashlib
class MinLengthError(Exception):
pass
class PossibleCharError(Exception):
pass
class NeedCharError(Exception):
pass
def password_validation(
password,
min_length=8,
possible_chars=’abcdefghijklmnopqrstuvwxyz0123456789′,
at_least_one=str.isdigit
):
if not isinstance(password, str):
raise TypeError
if len(password) < min_length:
raise MinLengthError
if any([char.lower() not in possible_chars for char in password]):
raise PossibleCharError
if not any([at_least_one(char) for char in password]):
raise NeedCharError
hash_object = hashlib.sha256()
hash_object.update(password.encode(‘utf-8’))
hex_dig = hash_object.hexdigest()
return hex_dig
принципиальных отличий между вашим и моим решением нет. Отличие одно – у вас в possible_char предложены заглавные буквы, а у меня для этого предусмотрено char.lower()
Вот ваше решение:
import hashlib
class MinLengthError(Exception):
pass
class PossibleCharError(Exception):
pass
class NeedCharError(Exception):
pass
possible_password_chars = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789’
def password_validation(password, min_length=8,
possible_chars=possible_password_chars,
at_least_one=str.isdigit) -> str:
if not isinstance(password, str):
raise TypeError
if len(password) < min_length:
raise MinLengthError
if any([char not in possible_chars
for char in password]):
raise PossibleCharError
if not any([at_least_one(char) for char in password]):
raise NeedCharError
hash_object = hashlib.sha256()
hash_object.update(password.encode())
hash = hash_object.hexdigest()
return hash
Представьте, что нам дали алфавит разрешенных символов, где запрещено использовать прописные буквы. ‘A’ использовать можно, а ‘a’ – нет.
И потом прислали пароль на проверку !AAAAaaaa123