有几种基于密码的认证方法。这些方法操作类似,但在用户密码如何在服务器上存储以及客户端提供的密码如何通过连接发送方面有所不同。
scram-sha-256
方法 scram-sha-256
执行 SCRAM-SHA-256 认证,如 RFC 7677 所述。它是一种挑战-响应机制,可以防止在不安全的连接上进行密码窃听,并支持以加密哈希形式在服务器上存储密码,这种形式被认为是安全的。
这是目前提供的最安全的方法,但旧的客户端库不支持它。
md5
方法 md5
使用一种自定义的、安全性较低的挑战-响应机制。它可以防止密码窃听,并避免在服务器上以明文形式存储密码,但如果攻击者设法从服务器窃取密码哈希,则无法提供任何保护。此外,MD5 哈希算法如今已不再被认为是能够抵御恶意攻击的。
为了方便从 md5
方法过渡到较新的 SCRAM 方法,如果在 pg_hba.conf
中指定了 md5
作为方法,但服务器上的用户密码是为 SCRAM 加密的(见下文),那么将自动选择基于 SCRAM 的认证。
对 MD5 加密密码的支持已弃用,并将在未来的 PostgreSQL 版本中移除。有关迁移到另一种密码类型的详细信息,请参阅下文。
password
方法 password
以明文形式发送密码,因此容易受到密码“窃听”攻击。如果可能,应始终避免使用它。然而,如果连接受到 SSL 加密的保护,则可以安全地使用 password
。(不过,如果依赖使用 SSL,SSL 证书认证可能是更好的选择)。
PostgreSQL 数据库密码与操作系统用户密码是分开的。每个数据库用户的密码存储在 pg_authid
系统目录中。密码可以使用 SQL 命令 CREATE ROLE 和 ALTER ROLE 进行管理,例如,CREATE ROLE foo WITH LOGIN PASSWORD 'secret'
,或使用 psql 命令 \password
。如果未为用户设置密码,则存储的密码为 null,并且该用户的密码认证将始终失败。
不同基于密码的认证方法的可用性取决于用户在服务器上的密码是如何加密(更准确地说,是哈希)的。这由设置密码时的时间点配置参数 password_encryption 控制。如果密码是使用 scram-sha-256
设置加密的,则可用于 scram-sha-256
和 password
认证方法(但在后一种情况下,密码传输将是明文的)。在本例中,认证方法规范 md5
将自动切换到使用 scram-sha-256
方法,如上所述,因此它也将工作。如果密码是使用 md5
设置加密的,则只能用于 md5
和 password
认证方法规范(同样,在后一种情况下,密码以明文形式传输)。(以前的 PostgreSQL 版本支持在服务器上以明文形式存储密码。现在已不再可能。)要检查当前存储的密码哈希,请参见系统目录 pg_authid
。
要将现有安装从 md5
升级到 scram-sha-256
,在确保所有使用的客户端库都足够新以支持 SCRAM 后,在 postgresql.conf
中设置 password_encryption = 'scram-sha-256'
,让所有用户设置新密码,并在 pg_hba.conf
中将认证方法规范更改为 scram-sha-256
。
如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表格 报告文档问题。