从 md5 密码迁移到 scram-sha-256
PostgreSQL安全命令
-- 1) Store new passwords as SCRAM
ALTER SYSTEM SET password_encryption = 'scram-sha-256';
SELECT pg_reload_conf();
-- 2) Find roles still carrying md5 password hashes (requires superuser)
SELECT rolname,
CASE
WHEN rolpassword LIKE 'SCRAM-SHA-256$%' THEN 'scram-sha-256'
WHEN rolpassword LIKE 'md5%' THEN 'md5'
WHEN rolpassword IS NULL THEN 'no password'
ELSE 'other'
END AS password_type,
rolvaliduntil
FROM pg_authid
WHERE rolcanlogin
ORDER BY password_type, rolname;
-- 3) Reset the password of each md5 role (preferably in psql: \password legacy_app)
ALTER ROLE legacy_app PASSWORD 'New#Password2';
# 4) Once all roles use SCRAM, change md5 -> scram-sha-256 in pg_hba.conf and reload作用
让新密码以 SCRAM-SHA-256 存储,找出仍带有 md5 哈希的登录角色,并给出在密码更新后将 pg_hba.conf 切换到 scram-sha-256 的步骤。
适用场景
当安全审计标记出 md5、升级到 PG14+ 之后,或为 md5 被弃用的版本做准备时。
注意
SCRAM 无法从现有的 md5 哈希推导出来;每个密码都必须以明文重新设置(需要与应用团队协调)。pg_hba.conf 中的 'md5' 方法会对密码为 SCRAM 的角色自动执行 SCRAM 认证,因此迁移期间保留 md5 是安全的过渡步骤,但一旦方法改为 'scram-sha-256',使用 md5 密码的角色将无法再连接。旧的客户端驱动(libpq < 10、旧版 JDBC/.NET 驱动)可能不支持 SCRAM;请先升级驱动。ALTER ROLE ... PASSWORD 可能通过 log_statement 将密码写入日志;psql \password 会在客户端先哈希再发送。