↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11
历史版本。 PostgreSQL 12 已结束支持。 2024-11-21. 请参阅 当前版本手册.

20.5. 密码认证 #

有几种基于密码的认证方法。这些方法的过程类似,但是区别在于用户密码如何被存放在服务器上以及客户端提供的密码如何被通过连接发送。

scram-sha-256

scram-sha-256 方法执行 SCRAM-SHA-256 认证,其定义见 RFC 7677。它是一种挑战-响应方案,可防止在不受信任连接上嗅探密码,并支持在服务器上以被认为安全的密码学 hash 形式存储密码。

这是当前提供的方法中最安全的一种,但是旧的客户端库不支持这种方法。

md5

方法 md5 使用一种自定义的、安全性较低的挑战-响应机制。它能防止密码嗅探,并避免在服务器上以明文存储密码;但如果攻击者设法从服务器上窃取了密码 hash,它就无法提供保护。此外,如今已不再认为 MD5 hash 算法能抵御有决心的攻击者。

md5 方法不能与 db_user_namespace 功能一起使用。

为了简化从 md5 方法到较新的 SCRAM 方法的转变,如果在 pg_hba.conf 中指定了 md5 但是用户在服务器上的密码是为 SCRAM(见下文)加密的,则将自动选择基于 SCRAM 的认证。

password

方法 password 以明文形式发送密码,因此它容易受到密码“嗅探”攻击。如果可能应该尽量避免使用它。不过,如果连接被 SSL 加密保护着,那么可以安全地使用 password(不过如果依靠 SSL,SSL 证书认证可能是更好的选择)。

PostgreSQL 数据库密码独立于操作系统用户密码。每个数据库用户的密码都存储在系统目录 pg_authid 中。密码可以通过 SQL 命令 CREATE ROLE 和 ALTER ROLE 管理,例如 CREATE ROLE foo WITH LOGIN PASSWORD 'secret',或者通过 psql 的 \password 命令管理。如果某个用户没有设置密码,则其存储密码为 null,该用户的密码认证将始终失败。

不同基于密码的认证方法是否可用,取决于用户在服务器上的密码是如何加密的(更准确地说,是如何进行 hash 运算的)。这由设置密码时的配置参数 password_encryption 控制。如果密码是使用 scram-sha-256 设置加密的,那么它可以用于 scram-sha-256 和 password 认证方法(但后一种情况下密码会以明文传输)。如上所述,此时如果认证方法指定为 md5,也会自动切换为使用 scram-sha-256,因此同样能够工作。如果密码是使用 md5 设置加密的,那么它只能用于 md5 和 password 认证方法(同样,后一种情况下密码会以明文传输)。(以前的 PostgreSQL 版本支持在服务器上存储明文密码,但现在已经不再可能。)要检查当前存储的密码 hash,可以查看系统目录 pg_authid。

要把现有安装从 md5 升级到 scram-sha-256,需要先确保所有正在使用的客户端库都足够新并支持 SCRAM,然后在 postgresql.conf 中设置 password_encryption = 'scram-sha-256',要求所有用户重新设置密码,并将 pg_hba.conf 中的认证方法设置改为 scram-sha-256。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.