Если БД утечёт — злоумышленник получит все пароли. Хеширование делает это невозможным.
Почему нельзя хранить пароли в открытом виде
Если БД утечёт — злоумышленник получит все пароли. Хеширование делает это невозможным.
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)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!