You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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,步骤如下:

  1. 修改PostgreSQL配置文件postgres.conf
    password_encryption = md5  # 把默认加密方式改回md5
    
  2. 重启PostgreSQL服务,让配置生效。
  3. 重新设置root用户的密码(因为之前的密码是scram格式的,需要重新生成md5哈希):
    ALTER USER root PASSWORD '26_v9Fe},,6\Z3E?';
    
  4. 修改pg_hba.conf文件,把对应连接的认证方式改为md5,比如:
    host    all             all             0.0.0.0/0               md5  # 替换成你实际的连接规则
    
  5. 重载PG配置,无需重启服务:
    SELECT pg_reload_conf();
    

补充说明

scram-sha-256md5的安全性更高,它是基于标准的SCRAM认证机制,能有效防止密码哈希泄露后的彩虹表攻击,所以优先推荐方案1升级驱动。

内容的提问来源于stack exchange,提问作者ravi ranjan

火山引擎 最新活动