程序可连接PostgreSQL 13但PGAdmin连接失败求助
我的程序通过以下参数可正常连接本地PostgreSQL 13服务器:
username = Juan password = <十六进制格式的密码> host = localhost port = 5432 dbname = madrid schema = huv_2.9 sslmode = allow
但使用PGAdmin创建服务器连接时被拒绝,PGAdmin弹出提示:
Please enter the password for the user 'Juan' to connect the server - "PostgreSQL 13"
输入哈希、加密或明文密码均无效。我认为这和需要从scram-sha-256切换为md5的情况类似。
请问:
- 为什么无法让PGAdmin像程序一样连接本地服务器(规避scram-sha-256与md5的问题)?
- 为什么PGAdmin无法忽略
C:\Program Files\PostgreSQL\13\Data下的配置文件,而我的程序可以?
核心原因
你的程序能正常连接,大概率是因为它直接发送了十六进制格式的密码哈希值,绕过了PostgreSQL的标准认证流程——相当于跳过了md5/scram的协商环节,直接提交了数据库存储的哈希结果;而PGAdmin是严格遵循PostgreSQL认证逻辑的客户端,它会先和服务器协商认证方式(scram-sha-256或md5),再要求你输入明文密码,之后按照协商好的算法加密后发送给服务器,这和你的程序连接逻辑完全不同。
关于配置文件的差异:PostgreSQL的标准客户端(包括PGAdmin)默认会读取系统级配置文件(比如pg_hba.conf、postgresql.conf)来确认认证规则;你的程序应该是硬编码了所有连接参数,且没有加载任何外部配置文件,所以看起来像是“忽略”了配置;而PGAdmin作为标准化工具,会严格遵循PostgreSQL的客户端配置逻辑,不会跳过这些文件。
解决办法
修改PostgreSQL认证方式适配PGAdmin:
- 打开
C:\Program Files\PostgreSQL\13\Data\pg_hba.conf文件 - 找到本地连接对应的行(通常是
host all all 127.0.0.1/32 scram-sha-256) - 将
scram-sha-256改为md5,保存文件 - 重启PostgreSQL 13服务
- 之后在PGAdmin中输入明文密码即可正常连接
- 打开
模拟程序连接逻辑(不推荐):
这种方式需要修改PGAdmin源码或自定义连接字符串,操作复杂且存在安全风险,优先推荐第一种方法。
内容的提问来源于stack exchange,提问作者floupinette

