20.5. 密码验证

有几种基于密码的身份验证方法。这些方法的操作类似,但是在用户密码存储在服务器上的方式以及如何通过连接发送 Client 端提供的密码方面有所不同。

  • scram-sha-256

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

这是当前提供的方法中最安全的方法,但是较旧的 Client 端库不支持此方法。

  • md5

    • 方法md5使用自定义的不太安全的质询-响应机制。它可以防止密码嗅探,并避免将密码以纯文本格式存储在服务器上,但是如果攻击者设法从服务器上窃取密码哈希,则不会提供任何保护。同样,如今,MD5 哈希算法不再被认为可以抵御确定的攻击。

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

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

  • password

    • 方法password以明文形式发送密码,因此容易受到密码“嗅探”攻击。如果可能,应始终避免使用它。如果连接受 SSL 加密保护,则可以安全地使用password。 (尽管如果使用 SSL 证书,则使用 SSL 证书身份验证可能是更好的选择)。

PostgreSQL 数据库密码与 os 用户密码分开。每个数据库用户的密码存储在pg_authid系统目录中。可以使用 SQL 命令CREATE ROLEALTER ROLE,例如 CREATE ROLE foo WITH LOGIN PASSWORD 'secret' 或 psql 命令\password来 Management 密码。如果未为用户设置密码,则存储的密码为 null,并且该用户的密码身份验证将始终失败。

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

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