有几种基于口令的认证方法。这些方法的过程类似,但是区别在于用户口令如何被存放在服务器上以及客户端提供的口令如何被通过连接发送。
scram-sha-256
方法scram-sha-256
执行SCRAM-SHA-256身份验证,如
在RFC 7677中描述的那样。它
是一种挑战-响应方案,可防止在不受信任的连接上嗅探密码,并支持在服务器上以
密码学哈希形式存储密码,被认为是安全的。
这是当前提供的方法中最安全的一种,但是旧的客户端库不支持这种方法。
md5
方法md5
使用一种自定义的安全性较低的挑战-响应机制。它能防止口令嗅探并且防止口令在服务器上以明文存储,但是无法保护攻击者想办法从服务器上窃取了口令哈希的情况。此外,现在认为MD5哈希算法对于确定攻击已经不再安全。
md5
方法不能与db_user_namespace特性一起使用。
为了简化从md5
方法到较新的SCRAM方法的转变,如果在pg_hba.conf
中指定了md5
但是用户在服务器上的口令是为SCRAM(见下文)加密的,则将自动选择基于SCRAM的认证。
password
方法password
以明文形式发送口令,因此它对于口令“嗅探”攻击很脆弱。如果可能应该尽量避免使用它。不过,如果连接被SSL加密保护着,那么可以安全地使用password
(不过如果依靠SSL,SSL证书认证可能是更好的选择)。
PostgreSQL数据库口令独立于操作系统用户口令。每个数据库用户的口令被存储在pg_authid
系统目录中。口令可以用 SQL 命令CREATE USER和ALTER ROLE管理,例如CREATE ROLE foo WITH LOGIN PASSWORD 'secret'
或者psql的\password
命令。如果没有为一个用户设置口令,那么存储的口令为空并且对该用户的口令认证总会失败。
不同的基于口令的认证方法的可用性取决于用户的口令在服务器上是如何被加密(或者更准确地说是哈希)的。这由设置口令时的配置参数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
.