PostgreSQL从10.x升级至13后特定密码引发的认证失败故障求助
分析PostgreSQL 10→13升级后Java连接认证失败的问题
咱先来拆解下你遇到的问题——这其实是PostgreSQL版本迭代中密码加密机制变更引发的典型兼容性问题,我之前帮好几个开发者排查过类似情况。
核心原因
PostgreSQL 10默认使用md5加密存储用户密码,而从版本10开始PostgreSQL就逐步推进更安全的scram-sha-256加密,到PG13时已经把它设为默认加密方式。虽然你用了相同的明文密码在PG13中创建用户,但PG13存储的是scram-sha-256格式的哈希值,而你的Java连接环境可能没跟上这个变化,导致认证流程不匹配,最终抛出org.postgresql.util.PSQLException: FATAL: password authentication failed for user root错误。
具体解决办法
这里给你两个可行的方案,按需选择:
方案1:升级PostgreSQL JDBC驱动(推荐)
老版本的PostgreSQL JDBC驱动(比如42.2.0之前的版本)不支持scram-sha-256认证协议。你需要把驱动版本升级到42.2.0及以上,这个版本开始正式支持scram认证。
- 如果你用Maven,直接修改依赖:
<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.6.0</version> <!-- 用最新稳定版即可 --> </dependency> - 升级后,Java连接代码不需要额外修改,驱动会自动适配PG13的scram认证流程。
方案2:回退PG13的密码加密方式(适合暂时无法升级驱动的场景)
如果你暂时没法升级JDBC驱动,可以把PG13的加密方式改回md5,步骤如下:
- 修改PostgreSQL配置文件
postgres.conf:password_encryption = md5 # 把默认加密方式改回md5 - 重启PostgreSQL服务,让配置生效。
- 重新设置
root用户的密码(因为之前的密码是scram格式的,需要重新生成md5哈希):ALTER USER root PASSWORD '26_v9Fe},,6\Z3E?'; - 修改
pg_hba.conf文件,把对应连接的认证方式改为md5,比如:host all all 0.0.0.0/0 md5 # 替换成你实际的连接规则 - 重载PG配置,无需重启服务:
SELECT pg_reload_conf();
补充说明
scram-sha-256比md5的安全性更高,它是基于标准的SCRAM认证机制,能有效防止密码哈希泄露后的彩虹表攻击,所以优先推荐方案1升级驱动。
内容的提问来源于stack exchange,提问作者ravi ranjan




