2024年9月26日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 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。如果未为用户设置密码,则存储的密码为 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

提交更正

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