Ответ
PostgreSQL не шифрует, а хеширует пароли перед хранением. Метод хеширования настраивается и эволюционировал со временем. В своей работе я всегда настраиваю использование самых современных и безопасных методов.
Доступные методы (в pg_hba.conf указывается как auth-method):
-
scram-sha-256(РЕКОМЕНДУЕМЫЙ, начиная с PostgreSQL 10):- Как работает: Использует протокол SCRAM (Salted Challenge Response Authentication Mechanism) с SHA-256. Это стойкий к подбору метод, который не передаёт хэш по сети даже во время аутентификации.
- Формат хранения: В системном каталоге
pg_authidхранятсяsalt(соль) иiterations(количество раундов) отдельно от результата вычислений.-- Создание пользователя с паролем (будет использован scram-sha-256 по умолчанию, если задан password_encryption) CREATE ROLE app_user WITH LOGIN PASSWORD 'StrongPass123!';
-
md5(УСТАРЕВШИЙ, следует избегать):- Как работает: Хранит MD5-хеш от конкатенации пароля и имени пользователя. Уязвим к атакам перебором.
- Почему не использовать: Алгоритм MD5 криптографически сломан.
-
password(ОПАСНЫЙ, только для legacy):- Как работает: Передаёт и может хранить пароль в открытом виде.
- Никогда не используйте в production.
Критически важная настройка password_encryption:
Этот параметр в postgresql.conf определяет, какой алгоритм будет использоваться по умолчанию при задании пароля командой CREATE/ALTER ROLE ... PASSWORD.
# postgresql.conf
password_encryption = scram-sha-256 # Устанавливаем самый безопасный метод по умолчанию
После изменения конфига требуется перезагрузка (pg_reload_conf()).
Настройка аутентификации в pg_hba.conf:
# pg_hba.conf
# Разрешаем подключения с локального хоста только по SCRAM-SHA-256
host all all 127.0.0.1/32 scram-sha-256
# Для хостов из доверенной сети можно использовать 'trust', но не для паролей!
Мой подход: В новых кластерах я сразу устанавливаю password_encryption = scram-sha-256 и в pg_hba.conf указываю только scram-sha-256 для парольной аутентификации, полностью отказываясь от md5.