📝 Python

Хеширование паролей с Argon2 и pwdlib

P
Автор
PyLand Team
📅
Опубликовано
30.06.2026
⏱️
Время чтения
1 мин
👁️
Просмотров
2186
🌳
Уровень
Продвинутый

При утечке базы данных надёжное хеширование не раскрывает пароли напрямую и заметно усложняет их перебор. Однако слабые пароли всё равно можно подобрать, поэтому также важны разумная парольная политика, ограничение частоты запросов и многофакторная аутентификация.

Почему нельзя хранить пароли в открытом виде

Храни только хеши паролей с уникальной солью, но никогда не сами пароли. Для нового проекта используй поддерживаемую библиотеку и рекомендуемый ею алгоритм с актуальными параметрами.

pwdlib с Argon2

uv add "pwdlib[argon2]"
from pwdlib import PasswordHash

password_hash = PasswordHash.recommended()

# Создать хеш пароля
hashed = password_hash.hash("my_password")
# '$argon2id$...' — хеш Argon2id

# Проверить пароль
is_valid = password_hash.verify("my_password", hashed)     # True
is_valid = password_hash.verify("wrong_password", hashed)  # False

Почему Argon2id

  • разработан специально для хеширования паролей и усложняет перебор на GPU;
  • использует уникальную соль, поэтому одинаковые пароли дают разные хеши;
  • позволяет настраивать затраты времени, памяти и параллелизма;
  • PasswordHash.recommended() выбирает поддерживаемые рекомендуемые настройки.

В FastAPI и SQLModel

from pwdlib import PasswordHash

password_hash = PasswordHash.recommended()

class User(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    username: str = Field(unique=True)
    hashed_password: str

def create_user(session: Session, username: str, password: str) -> User:
    user = User(
        username=username,
        hashed_password=password_hash.hash(password),
    )
    session.add(user)
    session.commit()
    return user

def authenticate(session: Session, username: str, password: str) -> User | None:
    user = session.exec(select(User).where(User.username == username)).first()
    if not user or not password_hash.verify(password, user.hashed_password):
        return None
    return user

В реальном модуле добавь недостающие импорты Optional, Field, SQLModel, Session и select из используемых тобой версий Python и SQLModel.

Уже существующие bcrypt-хеши

uv add "pwdlib[argon2,bcrypt]"

Для новых хешей предпочитай Argon2id. Если в системе уже есть bcrypt-хеши, настрой миграцию: проверь старый хеш и замени его на Argon2id после следующего успешного входа пользователя. Не меняй алгоритм без проверки совместимости с сохранёнными хешами.

Ваша реакция на статью

💬 Комментарии (0)

🔐 Войдите в систему, чтобы оставить комментарий
🚪 Войти
💭

Комментариев пока нет

Станьте первым, кто поделится мнением об этой статье!

🔗 Похожие

Похожие статьи

Продолжите изучение с этими материалами

📝

if __name__ == "__main__": точка входа Python

Конструкция if name == "main" определяет точку входа Python-программы: она помогает отличить прямой запуск файла...

📅 14.08.2026 👁️ 44
📝

strip() и lower(): подготавливаем пользовательски…

Пользователь может ввести правильное слово с лишними пробелами или буквами другого регистра. Для Python строки...

📅 11.08.2026 👁️ 50
📝

ord(), chr() и циклический сдвиг букв в Python 🔐

Строка состоит из символов, но компьютер хранит каждый символ как числовой код. Python позволяет переходить...

📅 09.08.2026 👁️ 89
🎓 Продолжить обучение

В каких курсах используется этот материал

Перейдите к курсу, чтобы закрепить материал на практике.

FastAPI: от первого маршрута до AI-сайта Открыть программу курса