Как зашифровать пароль в Python
Расскажу вам о том, как зашифровать пароль в Python? Есть ситуации в которых потеря базы данных - это раскрытие персональных данных, настроек для подключения к разным серверам. Как тут обезопасить данные в БД? Тут нужно при помощи библиотеки cryptography шифровать данные с использованием ключа. В этом случае даже если украдут весь сервер с кодом и базой, пароли всё равно остаются необратимыми. Часто нужно зашифровывать новый пароль при создании его записи и расшифровать пароль перед его использованием.
Ситуации, когда шифрование паролей оправдано (и даже необходимо)
- Не пользовательские пароли, а учётные данные интеграций (API ключи, пароли к базам, SMTP, внешним сервисам, OAuth client secrets и т.п.) - именно для них часто используют обратимое шифрование с ключом, который лежит в secrets manager (HashiCorp Vault, AWS Secrets Manager, Azure Key Vault, Kubernetes secrets + encryption at rest и т.д.)
- Очень редкие legacy-системы, где приложение само должно подставлять пароль от имени пользователя в сторонний протокол, который не поддерживает токены / OAuth / сертификаты.
Покажу вам простой способ с использованием библиотеки cryptography.
from cryptography.fernet import Fernet
import base64
# Это ТОЛЬКО для примера! Настоящий ключ должен быть в secrets manager
MASTER_KEY = base64.urlsafe_b64encode(b"32-байтовый-ключ-очень-секретный!!") # 32 байта
fernet = Fernet(MASTER_KEY)
def encrypt_password(plain: str) → str:
return fernet.encrypt(plain.encode()).decode()
def decrypt_password(encrypted: str) → str:
return fernet.decrypt(encrypted.encode()).decode()
Разумеется ключ нужно хранить за пределами проекта. Это даст сто процентную гарантию того что злоумышленник не сможет расшифровать пароли или другую конфиденциальную информацию. Если не знаете как генерировать ключ, то посмотрите на страницу Как генерировать SECRET_KEY для FastAPI.