在 PostgreSQL 中,trust 和 scram-sha-256 是 pg_hba.conf(客户端认证配置文件)中用来控制数据库访问权限的两种身份验证方法。它们决定了用户连接数据库时,“如何证明自己是自己”。
简单概括两者的区别:trust 是无条件放行(免密),scram-sha-256 是加密密码验证(最安全)。
以下是详细的对比和原理解析:
1. 什么是 trust(信任认证)?
含义:只要连接请求的来源 IP/Unix Socket 符合 pg_hba.conf 中的规则,数据库就会无条件允许该用户登录。
验证过程:完全跳过密码验证。用户甚至不需要提供密码(或提供任意错误密码都能登录)。
安全性:极低。相当于把家门的钥匙直接挂在门把手上。
适用场景:
- 仅限本地连接(local 或 host 127.0.0.1)的开发测试环境。
- 数据库服务器处于完全隔离的内网,且没有安全风险。
- 绝对不能用于生产环境或任何暴露在网络中的数据库。
2. 什么是 scram-sha-256(SCRAM-SHA-256 认证)?
含义:全称是 Salted Challenge Response Authentication Mechanism with SHA-256。它是 PostgreSQL 目前最安全的默认密码加密认证方式(从 PostgreSQL 10 引入,PG 14+ 成为默认)。
验证过程:客户端与服务器之间不直接传输明文密码。具体流程如下:
- 客户端发起连接请求。
- 服务器发送一个随机生成的 Salt(盐值)和迭代次数给客户端。
- 客户端使用 SHA-256 算法将“密码 + Salt”混合计算出摘要(Digest),发送回服务器。
- 服务器用自己存储的加密密钥进行比对。即使网络被监听,黑客拿到的也只是动态的加密摘要,无法反推出原始密码。
安全性:极高。防窃听、防重放攻击,且加盐后能有效抵御彩虹表撞库。
适用场景:所有生产环境、公网访问、需要高安全合规的场景。
3. 核心区别对比表
| 对比维度 | trust | scram-sha-256 |
|---|---|---|
| 是否需要密码 | ❌ 不需要(随意输入) | ✅ 必须提供正确密码 |
| 密码在网络传输 | 不传输(因为没有校验) | 不传输明文(传输的是加密摘要,加盐哈希) |
| 抗窃听能力 | ❌ 毫无防备 | ✅ 即使被抓包,也无法破解密码 |
| 用户密码存储 | 不检查密码,存储内容无关 | 在 pg_authid 表中存储SCRAM-SHA-256$<salt>$<stored_key>$<server_key> |
| 性能开销 | 极低(几无开销) | 略微高于 Trust(有计算哈希的 CPU 开销,但现代服务器可忽略) |
| 安全性 | ⚠️ 致命缺陷(任何人都能伪装) | ✅ 工业级安全 |
| 默认配置倾向 | 仅用于 local 本地测试 | 生产环境绝对首选 |
4. 重要的配置关联(password_encryption)
需要注意的是,在 pg_hba.conf 中配置了 scram-sha-256 后,PostgreSQL 还依赖一个服务端参数password_encryption来决定存储密码时的算法。
如果 pg_hba.conf 要求 scram-sha-256,但password_encryption设置为 md5,那么当用户执行ALTER USER ... PASSWORD ...时,密码仍会以较弱的 MD5 格式存储,导致连接失败。
正确做法:确保 postgresql.conf 中设置:
password_encryption = scram-sha-2565. 它们通常写在哪儿?
在$PGDATA/pg_hba.conf文件中,常见写法如下:
# 本地连接(仅限开发测试)—— 可以使用 trustlocalall postgres trust# 本地 IPv4 连接(必须走密码)—— 必须使用 scram-sha-256hostall all127.0.0.1/32 scram-sha-256# 远程应用连接(生产环境)—— 强制使用 scram-sha-256hostall app_user192.168.1.0/24 scram-sha-256💡 建议
如果是为了解决连接报错(比如no pg_hba.conf entry),尽量不要为了省事设置成 trust,除非你确定只有你自己能连且极看重方便。
安全底线:从 PostgreSQL 15 开始,官方甚至移除了对明文密码 password 方法的默认推荐,全力导向 scram-sha-256。请务必将生产环境数据库的 pg_hba.conf 配置为 scram-sha-256。
如果你在运维中需要快速排查,可以通过查询pg_hba_file_rules视图来确认当前生效的认证规则:
SELECT*FROMpg_hba_file_rules;