支持的版本:当前17)/ 16 / 15 / 14 / 13
开发版本:devel
不支持的版本:12 / 11

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。如果未为用户设置密码,则存储的密码为空,并且该用户的密码身份验证将始终失败。

不同的基于密码的身份验证方法的可用性取决于用户在服务器上的密码是如何加密的(更准确地说,是哈希的)。这由设置密码时配置参数 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

提交更正

如果您在文档中看到任何不正确、与您使用特定功能的体验不符或需要进一步澄清的内容,请使用此表格报告文档问题。