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

scram-sha-256

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

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

md5

方法MD5使用一种自定义的安全性较低的质询-响应机制。它防止密码嗅探,并避免在服务器上以纯文本形式存储密码,但如果攻击者设法从服务器窃取密码哈希,则不提供任何保护。此外,MD5散列算法现在不再被认为是针对确定的攻击是安全的。

MD5方法不能与db_user_name空间功能一起使用。

为了便于从MD5方法转换到较新的SCRAM方法,如果在pg_hba.conf中将MD5指定为方法,但服务器上的用户密码针对SCRAM进行了加密(见下文),则将自动选择基于SCRAM的身份验证。

password

方法Password以明文形式发送密码,因此容易受到密码“嗅探”攻击。如果可能的话,应该始终避免这种情况。但是,如果连接受SSL加密保护,则可以安全地使用密码。(不过,如果依赖于使用SSL,则SSL证书身份验证可能是更好的选择)。

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

不同的基于密码的身份验证方法的可用性取决于用户在服务器上的密码是如何加密的(或者更准确地说,是散列的)。这由设置密码时的配置参数PASSWORD_ENCRYPTION控制。如果密码是使用scram-sha-256设置加密的,那么它可以用于身份验证方法scram-sha-256和password(但在后一种情况下,密码传输将是纯文本)。如上所述,在这种情况下,身份验证方法规范MD5将自动切换到使用SCRAM-SHA-256方法,因此它也将起作用。如果密码是使用MD5设置加密的,则它只能用于MD5和密码身份验证方法规范(同样,密码在后一种情况下以纯文本传输)。(以前的PostgreSQL版本支持以纯文本形式将密码存储在服务器上。这已经不可能了。)。要检查当前存储的密码散列,请参阅系统目录pg_authid。

要将现有安装从MD5升级到scram-sha-256,请在确保使用中的所有客户端库都足够新以支持SCRAM后,在postgresql.conf中设置PASSWORD_ENCRYPTION=‘SCRAM-SHA-256’,让所有用户设置新密码,并将PG_hba.conf中的认证方法规范更改为SCRAM-SHA-256。

#查看密码加密

postgres=# show password_encryption ;
 password_encryption
---------------------
 scram-sha-256
(1 row)

postgres=#

#修改密码加密

postgres=# set password_encryption to 'scram-sha-256';
SET
postgres=#

#密码复杂度设置

# 安装源码自带插件 passwordcheck
# root用户下安装插件
cd /pgccc/app/postgresql-14.7/contrib\passwordcheck
make
make install
vim postgresql.conf
shared_preload_libraries = 'passwordcheck'
pg_ctl -D $PGDATA -U postgres -l logfile restart

#修改密码提示密码太短 

#密码复杂度配置成功

postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 ljfz      | Replication                                                | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

postgres=# alter user ljfz password 'pgccc';
2023-05-15 11:16:23.232 CST [2278] ERROR:  password is too short
2023-05-15 11:16:23.232 CST [2278] STATEMENT:  alter user ljfz password 'pgccc';
ERROR:  password is too short
postgres=#