📝 Python

Хеширование паролей: bcrypt и passlib

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

Если БД утечёт — злоумышленник получит все пароли. Хеширование делает это невозможным.

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

Если БД утечёт — злоумышленник получит все пароли. Хеширование делает это невозможным.

passlib — рекомендуемая библиотека

pip install passlib[bcrypt]
from passlib.context import CryptContext

pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

# Хешировать пароль
hashed = pwd_context.hash("my_password")
# '$2b$12$...' — bcrypt хеш

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

Почему bcrypt

  • Намеренно медленный (10-12 раундов хеширования)
  • Встроенная соль — одинаковые пароли дают разные хеши
  • Параметр cost factor — можно усилить со временем
  • Устойчив к брутфорсу и rainbow tables

В FastAPI / SQLModel

from passlib.context import CryptContext

pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

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=pwd_context.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 pwd_context.verify(password, user.hashed_password):
        return None
    return user

argon2 — альтернатива bcrypt

pip install passlib[argon2]
pwd_context = CryptContext(schemes=["argon2"], deprecated="auto")

Argon2 — победитель Password Hashing Competition 2015, рекомендуется для новых проектов.

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

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

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

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

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

🔗 Похожие

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

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

📝

Event loop в Python: как asyncio делает «параллел…

Event loop — сердце asyncio. Он не запускает код параллельно в нескольких потоках. Он переключается...

📅 30.06.2026 👁️ 120
📝

pytest-django: тестирование Django

Охватываемые темы: Установка, @pytest.mark.djangodb, Фикстуры, Тестирование views.

📅 30.06.2026 👁️ 130
📝

pip: менеджер пакетов Python

Охватываемые темы: Установка пакетов, Обновление и удаление, requirements.txt, Виртуальное окружение.

📅 30.06.2026 👁️ 117

Понравилась статья?

Подпишитесь на наши обновления и получайте новые статьи первыми. Развивайтесь вместе с PyLand!