帮你快速理解、总结文档立即下载

自定义密码复杂度

最近更新时间:2026-10-27 13:07:31
我的收藏
tencentdb_pwdcheck 是腾讯云自研的密码安全插件,提供三项能力:
密码复杂度检查:创建用户或修改密码时,校验密码长度及大写字母、小写字母、数字、特殊字符的组成,不满足策略直接报错。
认证失败延迟:密码认证失败时延迟响应,增加暴力破解成本。
订阅语句密码脱敏:CREATE/ALTER SUBSCRIPTION 语句中的连接密码在日志等处自动脱敏为 ********,防止明文密码落入日志。

支持版本

PostgreSQL 版本
支持版本
PostgreSQL 10
v10.17_r1.7及以上
PostgreSQL 11
v11.12_r1.6及以上
PostgreSQL 12
v12.7_r1.7及以上
PostgreSQL 13
v13.20_r1.23及以上
PostgreSQL 14
v14.17_r1.31及以上
PostgreSQL 15
v15.12_r1.17及以上
PostgreSQL 16
v16.8_r1.11及以上
PostgreSQL 17
v17.4_r1.5及以上
PostgreSQL 18
v18.0_r1.0及以上
说明:
您可在控制台实例详情页或执行 SHOW tencentdb_version; 查看当前实例的内核版本。

注意事项

预加载插件:使用前请先在控制台参数设置页找到 shared_preload_libraries 参数,在其参数运行值中勾选 tencentdb_pwdcheck,保存后重启实例。
默认不开启:加载插件后,还需在控制台参数设置页中开启参数 tencentdb_pwdcheck.enable_tencentdb_pwdcheck,密码检查才生效;订阅密码脱敏无需该开关,插件加载后即生效。
超级用户不受约束:超级用户设置密码不受复杂度检查限制;管理员(tencentdb_superuser)与普通用户均受约束。
仅接受明文密码:开启检查后,直接设置 md5 等已加密密码串将被拒绝。

参数说明

以下参数均为 SIGHUP 级,均可在控制台参数设置中修改,保存后自动生效,无需重启实例。
参数
默认值
说明
tencentdb_pwdcheck.enable_tencentdb_pwdcheck
off
密码检查与认证延迟的总开关
tencentdb_pwdcheck.min_length
8
密码最小长度
tencentdb_pwdcheck.max_length
32
密码最大长度
tencentdb_pwdcheck.min_uppercase_number
1
至少包含的大写字母个数
tencentdb_pwdcheck.min_lowercase_number
1
至少包含的小写字母个数
tencentdb_pwdcheck.min_digit_number
1
至少包含的数字个数
tencentdb_pwdcheck.min_special_character_number
1
至少包含的特殊字符个数
tencentdb_pwdcheck.delay_milliseconds
0
认证失败时的延迟毫秒数
有效特殊字符包括:()`~!@#$%^&*-+=_|{}[]:;'<>,.?/(不含反斜杠 \\)。密码中出现其他字符(如空格、中文)将被直接拒绝。

使用方法

以下示例假设实例中已有管理员 root(tencentdb_superuser 成员),业务用户为 app_user。

1. 开启密码检查

插件加载后,还需开启功能开关(SIGHUP 级参数,修改后无需重启实例)。该参数需在控制台修改:
1.2 在实例列表,单击实例 ID 或操作列的管理,进入实例详情页面。
1.3 选择参数设置。
1.4 搜索参数 tencentdb_pwdcheck.enable_tencentdb_pwdcheck,将其参数运行值修改为 on 并保存。
开启后,可通过以下语句确认参数状态:
postgres=# SHOW tencentdb_pwdcheck.enable_tencentdb_pwdcheck;
tencentdb_pwdcheck.enable_tencentdb_pwdcheck
----------------------------------------------
on
(1 row)
未开启时,弱密码可正常设置(对照):
postgres=# CREATE USER app_user PASSWORD 'weak';
CREATE ROLE

2. 密码复杂度校验效果

超级用户设置弱密码不受限制:
postgres=# ALTER USER app_user PASSWORD '123';
ALTER ROLE
管理员设置密码时受策略约束,以下用例依次演示各类不合规密码的报错,以及合规密码通过:
root=> ALTER USER app_user PASSWORD 'asd';
ERROR: Password too short. Minimum length is 8.
root=> ALTER USER app_user PASSWORD 'abcdsdefg';
ERROR: password need at least 1 uppercase letter
root=> ALTER USER app_user PASSWORD 'Aassdsaddb@';
ERROR: password need at least 1 digit
root=> ALTER USER app_user PASSWORD 'Aassadasddb11';
ERROR: password need at least 1 special character
root=> ALTER USER app_user PASSWORD 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
ERROR: Password too long. Maximum length is 32.
root=> ALTER USER app_user PASSWORD 'md5e589150ae7d28f93333afae92b36ef48';
ERROR: Cannot use tencentdb_pwdcheck extension while using encrypted password
root=> ALTER USER app_user PASSWORD 'Aassadasddb11#$';
ALTER ROLE
默认策略为:长度8 ~ 32,且至少包含1个大写字母、1个小写字母、1个数字、1个特殊字符。

3. 自定义密码策略

各策略参数均可在控制台参数设置中修改。下面以将最小密码长度从默认8调整为12为例进行演示:
3.2 在实例列表,单击实例 ID 或操作列的管理,进入实例详情页面。
3.3 选择参数设置。
3.4 搜索参数 tencentdb_pwdcheck.min_length,将其参数运行值修改为 12 并保存。
保存后策略立即生效,长度不足12的密码将被拒绝:
root=> ALTER USER app_user PASSWORD 'AAaa11$$';
ERROR: Password too short. Minimum length is 12.
root=> ALTER USER app_user PASSWORD 'AAaa11$$abcd';
ALTER ROLE

4. 订阅语句密码脱敏

CREATE SUBSCRIPTION 语句的连接串中包含发布端密码。插件加载后,该语句在数据库日志、错误详情等位置展示时,密码自动脱敏。
执行一条订阅语句(发布端地址不可达,仅用于演示):
postgres=# CREATE SUBSCRIPTION sub_test
CONNECTION 'host=127.0.0.1 port=1 dbname=postgres user=replicator password=Secret@123'
PUBLICATION pub_test;
ERROR: subscription "sub_test" could not connect to the publisher: connection to server at "127.0.0.1", port 1 failed: Connection refused
Is the server running on that host and accepting TCP/IP connections?
查看数据库日志(pg_log 目录),记录的语句中密码已脱敏为 ********:
2026-10-14 16:31:12.816 CST [4151291] LOG: statement: CREATE SUBSCRIPTION sub_test
CONNECTION 'user=replicator password=******** dbname=postgres host=127.0.0.1 port=1'
PUBLICATION pub_test;
ALTER SUBSCRIPTION 语句同样受脱敏保护。

5. 认证失败延迟

在控制台参数设置中将 tencentdb_pwdcheck.delay_milliseconds 设置为大于0的值后,密码认证失败的连接将延迟响应,用于增加暴力破解成本。实测(错误密码连接,delay 设为2000ms):延迟生效后单次失败连接耗时约2.010秒,未设置延迟(0ms)时约0.009秒。该参数仅影响认证失败的连接,正常登录无感知。

常见问题

Q1:设置密码没有触发复杂度检查怎么排查?

A:请依次确认:shared_preload_libraries 参数已勾选 tencentdb_pwdcheck 并重启;tencentdb_pwdcheck.enable_tencentdb_pwdcheck 参数为 on;当前操作用户不是超级用户。

Q2:为什么设置 md5 加密密码串会报错?

A:开启检查后插件只接受明文密码,由数据库完成加密存储,无法校验预先加密的密码串。

Q3:密码中可以使用反斜杠吗?

A:不可以。反斜杠不在有效特殊字符范围内,包含反斜杠的密码将被拒绝。

Q4:认证失败延迟会影响正常登录吗?

A:不会。延迟仅在密码认证失败时触发,认证成功的连接不产生任何延迟。

相关参考