Перейти к содержанию

Модуль хеширования паролей

Модуль password_hasher предоставляет реализацию интерфейса IPasswordHasher для безопасного хеширования и проверки паролей с использованием алгоритма Argon2.

UserPasswordHasher

Реализация хешера паролей на основе Argon2. Argon2 — это победитель конкурса Password Hashing Competition 2015 года, обеспечивающий защиту от атак перебором и использованием специализированного оборудования.

Особенности

  • Использует современный и безопасный алгоритм Argon2
  • Автоматически генерирует соль (salt) для каждого пароля
  • Поддерживает настройку параметров вычислительной сложности
  • Реализует интерфейс IPasswordHasher

Детали реализации

Bases: IPasswordHasher

Рабочий хешер паролей пользователей с использованием Argon2.

Source code in src/adapters/password_hasher.py
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class UserPasswordHasher(IPasswordHasher):
    """Рабочий хешер паролей пользователей с использованием Argon2."""

    def verify_password(self, password: str, hashed_password: str) -> bool:
        """Проверяет соответствие пароля и его хеша.

        Args:
            password: Оригинальный пароль в открытом виде.
            hashed_password: Хеш пароля для проверки.

        Returns:
            True, если пароль совпадает, иначе False.

        """
        return argon2.verify(password, hashed_password)

    def hash_password(self, password: str) -> str:
        """Создает безопасный хеш для указанного пароля.

        Args:
            password: Пароль в открытом виде.

        Returns:
            Хешированное значение пароля.

        """
        return argon2.hash(password)

hash_password(password: str) -> str

Создает безопасный хеш для указанного пароля.

Parameters:

Name Type Description Default
password str

Пароль в открытом виде.

required

Returns:

Type Description
str

Хешированное значение пароля.

Source code in src/adapters/password_hasher.py
22
23
24
25
26
27
28
29
30
31
32
def hash_password(self, password: str) -> str:
    """Создает безопасный хеш для указанного пароля.

    Args:
        password: Пароль в открытом виде.

    Returns:
        Хешированное значение пароля.

    """
    return argon2.hash(password)

verify_password(password: str, hashed_password: str) -> bool

Проверяет соответствие пароля и его хеша.

Parameters:

Name Type Description Default
password str

Оригинальный пароль в открытом виде.

required
hashed_password str

Хеш пароля для проверки.

required

Returns:

Type Description
bool

True, если пароль совпадает, иначе False.

Source code in src/adapters/password_hasher.py
 9
10
11
12
13
14
15
16
17
18
19
20
def verify_password(self, password: str, hashed_password: str) -> bool:
    """Проверяет соответствие пароля и его хеша.

    Args:
        password: Оригинальный пароль в открытом виде.
        hashed_password: Хеш пароля для проверки.

    Returns:
        True, если пароль совпадает, иначе False.

    """
    return argon2.verify(password, hashed_password)

Примеры использования

Автоматически генерирует соль (salt) для каждого пароля - Поддерживает настройку параметров вычислительной сложности - Реализует интерфейс IPasswordHasher

Детали реализации

Bases: IPasswordHasher

Рабочий хешер паролей пользователей с использованием Argon2.

Source code in src/adapters/password_hasher.py
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class UserPasswordHasher(IPasswordHasher):
    """Рабочий хешер паролей пользователей с использованием Argon2."""

    def verify_password(self, password: str, hashed_password: str) -> bool:
        """Проверяет соответствие пароля и его хеша.

        Args:
            password: Оригинальный пароль в открытом виде.
            hashed_password: Хеш пароля для проверки.

        Returns:
            True, если пароль совпадает, иначе False.

        """
        return argon2.verify(password, hashed_password)

    def hash_password(self, password: str) -> str:
        """Создает безопасный хеш для указанного пароля.

        Args:
            password: Пароль в открытом виде.

        Returns:
            Хешированное значение пароля.

        """
        return argon2.hash(password)

hash_password(password: str) -> str

Создает безопасный хеш для указанного пароля.

Parameters:

Name Type Description Default
password str

Пароль в открытом виде.

required

Returns:

Type Description
str

Хешированное значение пароля.

Source code in src/adapters/password_hasher.py
22
23
24
25
26
27
28
29
30
31
32
def hash_password(self, password: str) -> str:
    """Создает безопасный хеш для указанного пароля.

    Args:
        password: Пароль в открытом виде.

    Returns:
        Хешированное значение пароля.

    """
    return argon2.hash(password)

verify_password(password: str, hashed_password: str) -> bool

Проверяет соответствие пароля и его хеша.

Parameters:

Name Type Description Default
password str

Оригинальный пароль в открытом виде.

required
hashed_password str

Хеш пароля для проверки.

required

Returns:

Type Description
bool

True, если пароль совпадает, иначе False.

Source code in src/adapters/password_hasher.py
 9
10
11
12
13
14
15
16
17
18
19
20
def verify_password(self, password: str, hashed_password: str) -> bool:
    """Проверяет соответствие пароля и его хеша.

    Args:
        password: Оригинальный пароль в открытом виде.
        hashed_password: Хеш пароля для проверки.

    Returns:
        True, если пароль совпадает, иначе False.

    """
    return argon2.verify(password, hashed_password)

Примеры использования

Создание и использование хешера

from src.adapters.password_hasher import UserPasswordHasher

# Создание экземпляра хешера
hasher = UserPasswordHasher()

# Хеширование пароля
hashed_password = hasher.hash_password("my_secure_password")

# Проверка пароля
is_valid = hasher.verify_password("my_secure_password", hashed_password)  # Вернет True

Интеграция с пользовательской моделью

from dataclasses import dataclass
from src.adapters.password_hasher import UserPasswordHasher

hasher = UserPasswordHasher()

@dataclass
class User:
    username: str
    _hashed_password: str

    def set_password(self, password: str) -> None:
        self._hashed_password = hasher.hash_password(password)

    def check_password(self, password: str) -> bool:
        return hasher.verify_password(password, self._hashed_password)

Рекомендации

  1. Безопасность паролей
  2. Никогда не храните пароли в открытом виде
  3. Используйте длинные и сложные пароли
  4. Регулярно обновляйте параметры хеширования

  5. Производительность

  6. Настройте параметры сложности в соответствии с вашими требованиями
  7. Учитывайте нагрузку на процессор при аутентификации большого числа пользователей

  8. Миграции

  9. При смене алгоритма хеширования предусмотрите механизм обновления хешей
  10. Храните информацию о версии алгоритма хеширования

Примечания

  • Текущая реализация использует настройки по умолчанию библиотеки passlib
  • Для продакшн-среды рекомендуется настроить параметры сложности в соответствии с вашими требованиями безопасности