# 21.5.密码验证

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

紧急停堆-sha-256

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

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

md5

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

这个md5方法不能与分贝_使用者_名称空间特色

以缓解从md5方法转换为较新的紧急停堆方法,如果md5在中指定为方法pg_hba。形态但服务器上的用户密码在紧急停堆时进行了加密(见下文),然后将自动选择基于紧急停堆的身份验证。

暗语

方法暗语以明文形式发送密码,因此容易受到密码“嗅探”攻击。如果可能的话,应该尽量避免。如果连接受SSL加密保护,则暗语但可以安全使用。(尽管如果依赖于使用SSL,SSL证书认证可能是更好的选择)。

PostgreSQL数据库密码与操作系统用户密码是分开的。每个数据库用户的密码都存储在pg_authid系统目录。可以使用SQL命令管理密码创建角色改变角色,例如。,创建登录密码为“secret”的角色foo,或psql命令\密码。如果没有为用户设置密码,则存储的密码为空,并且该用户的密码身份验证将始终失败。

不同基于密码的身份验证方法的可用性取决于用户在服务器上的密码是如何加密的(或者更准确地说是散列的)。这由配置参数控制暗语_加密在设置密码时。如果使用紧急停堆-sha-256设置,则可用于身份验证方法紧急停堆-sha-256暗语(但在后一种情况下,密码传输将是纯文本的)。身份验证方法规范md5将自动切换到使用紧急停堆-sha-256方法,所以它也会起作用。如果使用md5设置,则只能用于md5暗语身份验证方法规范(同样,在后一种情况下,密码以纯文本传输)。(以前的PostgreSQL版本支持在服务器上以纯文本形式存储密码。这已不再可能。)要检查当前存储的密码哈希,请参阅系统目录pg_authid.

从升级现有安装的步骤md5紧急停堆-sha-256,在确保所有正在使用的客户端库都足够新以支持紧急停堆后,设置密码加密='scram-sha-256'在里面postgresql。形态,使所有用户设置新密码,并更改中的身份验证方法规范pg_hba。形态紧急停堆-sha-256.