PostgreSQL通过Flyway创建加密密码用户认证失败求助
问题分析与解决方法
核心错误原因
你用sha256sum生成的哈希和PostgreSQL要求的SCRAM-SHA-256哈希完全不是一回事。SCRAM-SHA-256不是简单对密码做SHA256哈希,它是一种加盐的哈希算法,包含盐值、迭代次数、客户端/服务器密钥等多部分信息,格式为SCRAM-SHA-256$<迭代次数>:<盐值>$<客户端密钥哈希>:<服务器密钥哈希>,普通SHA256哈希根本不满足这个格式,所以认证必然失败。
正确的处理方式
方法1:让PostgreSQL生成合法的SCRAM哈希(推荐)
直接在PostgreSQL服务器上生成目标用户的加密密码,再把哈希值复制到Flyway脚本:
- 登录PostgreSQL命令行:
psql -U postgres -d your_database
- 执行命令创建/更新用户(替换
your_user和Password!为实际值):
CREATE USER your_user WITH ENCRYPTED PASSWORD 'Password!'; -- 若用户已存在,用ALTER语句 -- ALTER USER your_user WITH ENCRYPTED PASSWORD 'Password!';
- 查询系统表获取生成的完整SCRAM哈希:
SELECT rolpassword FROM pg_roles WHERE rolname = 'your_user';
- 把查询到的哈希值(格式类似
SCRAM-SHA-256$4096:abc123...$def456...:ghi789...)复制到Flyway脚本:
CREATE USER your_user WITH ENCRYPTED PASSWORD 'SCRAM-SHA-256$4096:abc123...$def456...:ghi789...';
方法2:用pgcrypto函数自动化生成哈希
如果需要自动化生成,可借助PostgreSQL的pgcrypto扩展:
- 先启用扩展:
CREATE EXTENSION IF NOT EXISTS pgcrypto;
- 生成合规的SCRAM哈希:
SELECT scram_build('Password!');
返回的结果可直接复制到Flyway脚本中使用。
关键注意点
- 不要手动构造SCRAM哈希格式,哪怕加了
SCRAM-SHA-256前缀,缺少盐和迭代次数等核心参数也无法通过认证。 - Flyway脚本中使用哈希时,必须用单引号包裹完整的哈希字符串,且不能修改哈希的任何部分。
内容的提问来源于stack exchange,提问作者robjwilkins
相关产品推荐
相关产品推荐

