Redrock Postgres 搜索 英文
版本: 11 / 12 / 13 / 14 / 15 / 16 / 17

20.5. 密码验证 #

有几种基于密码的验证方法。这些方法操作方式相似,但用户密码在服务器上的存储方式和客户端提供的密码在连接中发送的方式有所不同。

scram-sha-256

方法 scram-sha-256 执行 SCRAM-SHA-256 验证,如 RFC 7677 中所述。这是一种质询响应机制,它可以防止在不受信任的连接上对密码进行窃取,并且支持以加密的哈希形式将密码存储在服务器上,而这种形式被认为是安全的。

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

md5

方法 md5 使用一种定制的、安全性较低的质询响应机制。它可以防止密码窃取,并且避免以纯文本形式在服务器上存储密码,但如果攻击者设法从服务器窃取密码哈希,则无法提供任何保护。此外,现如今 MD5 哈希算法不再被认为能够防止攻击。

为了简化从 md5 方法到较新的 SCRAM 方法的过渡,如果在 pg_hba.conf 中将 md5 指定为一种方法,但服务器上用户的密码是为 SCRAM 加密的(见下文),那么基于 SCRAM 的验证将自动选择为替代机制。

password

password 方法以明文方式发送密码,因此容易受到密码窃取攻击。如果可能,应该始终避免使用。不过,如果连接受 SSL 加密保护,则可以安全地使用 password。(如果依赖于使用 SSL,则 SSL 证书验证可能是更好的选择)。

PostgreSQL 数据库密码与操作系统用户密码不同。每个数据库用户的密码存储在 pg_authid 系统编录中。可以使用 SQL 命令 CREATE ROLEALTER ROLE(例如,CREATE ROLE foo WITH LOGIN PASSWORD 'secret')或 psql 命令 \password 管理密码。如果为用户设置了密码,则会存储为 null,且密码验证对于该用户始终会失败。

不同基于密码验证方法的可用性取决于服务器上用户密码加密(或更准确地说,是哈希)的方式。在设置密码时,这是由配置参数 password_encryption 控制的。如果使用 scram-sha-256 设置对密码加密,则可以使用验证方法 scram-sha-256password(但在后一种情况下,密码传输将以纯文本形式进行)。验证方法规范 md5 将像上面解释的那样自动切换为使用 scram-sha-256 方法,因此它也将起作用。如果使用 md5 设置对密码加密,则只能使用 md5password 验证方法规范(同样,在后一种情况下,密码以纯文本形式传输)。(之前的 PostgreSQL 版本支持将密码以纯文本形式存储在服务器上。现在不再可能这样做。)要检查当前存储的密码哈希值,请参阅系统编录 pg_authid

要在从 md5 升级现有安装到 scram-sha-256 之后(在确保所有正在使用的客户端库都足够新以支持 SCRAM)时,请在 postgresql.conf 中将 password_encryption = 'scram-sha-256' 设置好,让所有用户设置新密码,并将 pg_hba.conf 中的验证方法规范更改为 scram-sha-256