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