J. Валидация пароля

После того как пользователь ввёл свои данные в требуемом формате, можно позаботиться и о пароле.

Напишите функцию 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 пароля.

Посмотреть код

Решение

Python
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
Подписаться
Уведомить о
guest
2 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Расул
Расул
06.09.2024 17:03

Подскажите пожалуйста, почему это решение не проходит

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

Последний раз редактировалось 13 дней назад Сергей Клочко ем