八月 21, 2024
摘要:在本教程中,您将学习如何在 PostgreSQL 中检查密码强度。
目录
介绍
passwordcheck 是 PostgreSQL 中的一个 contrib 模块,它能够检查原始密码字符串是否能够遵守某些策略。在大多数情况下用户都应该会使用加密密码,以避免通过网络传递纯文本密码。而对于加密密码,passwordcheck 的检查有限,例如 MD5 的哈希字符串,但是仍然可以检查它们是否匹配用户名。对于纯文本密码,检查功能就要高级一些了,具有以下规则:
- 长度最少为 8 个字符。
- 检查密码是否有用户名。
- 检查密码是否包含字母和非字母。
- 还可以选择使用 cracklib 进行更多检查。
请注意,所有这些规则都是在编译时确定的,除非通过分叉代码和创建自己的模块,否则无法对其进行配置。
PostgreSQL passwordcheck 示例
passwordcheck
必须通过配置shared_preload_libraries
的方式来启用:
SHOW shared_preload_libraries;
shared_preload_libraries
--------------------------
passwordcheck
(1 row)
以纯文本形式提供密码的示例用法:
ALTER ROLE foo PASSWORD 'foo';
ERROR: password is too short
ALTER ROLE postgres PASSWORD 'postgres';
ERROR: password must not contain user name
ALTER ROLE foo PASSWORD 'foobar';
ERROR: password must not contain user name
ALTER ROLE foo PASSWORD 'boobarbaz';
ERROR: password must contain both letters and nonletters
使用以加密格式提供的密码时,只会简单地检查密码是否匹配用户名:
ALTER ROLE foo ENCRYPTED PASSWORD 'SCRAM-SHA-256$4096:eUHVJZ5WSsEomBt9BgHJzQ==$x57IR2ZcoKl8tlz5I2w636bquX3JmCYmi4LlDIa5lIY=:viXV52BLraOFRaw1gCp22K9VgLe6Rvi1nvcWNR6PTe4=';
ERROR: password must not equal user name
其他密码将按原样接受;在这里,将值foobar
(以纯文本形式提供时会被拒绝)作为加密密码传递:
ALTER ROLE foo ENCRYPTED PASSWORD 'SCRAM-SHA-256$4096:aiSTMi/J+KkJa9WFMgiahg==$f//pUq3yGJ6E8UbCxJWcGvnylc0aNuZR6WuLAcYSzWA=:yzMz+l1TIAYQ28tdQ2YopKwQiIjMwpGAariL2jmeaxU=';
设置 cracklib
在一个基于 Linux 的系统上安装 cracklib:
yum install cracklib cracklib-devel cracklib-dicts
创建给 CrackLib 使用的单词索引:
create-cracklib-dict /usr/share/dict/*
此命令会从单词列表创建 CrackLib 词典,通常默认的词典路径位于/usr/lib/cracklib_dict
。
将passwordcheck
的Makefile
中注释的两行还原,然后重新构建模块。
# uncomment the following two lines to enable cracklib support
# PG_CPPFLAGS = -DUSE_CRACKLIB '-DCRACKLIB_DICTPATH="/usr/lib/cracklib_dict"'
# SHLIB_LINK = -lcrack
重新安装passwordcheck
模块。
带 cracklib 的 passwordcheck 示例
将 cracklib 集成到passwordcheck
模块中后,让我们使用以纯文本形式提供的密码,来进行一些测试:
ALTER USER user1 PASSWORD '123';
ERROR: password is too short
ALTER USER user1 PASSWORD '123456789';
ERROR: password must contain both letters and nonletters
ALTER USER user1 PASSWORD 'Hello123456789';
ALTER USER user1 PASSWORD 'Hello123456';
ALTER USER user1 PASSWORD 'He123456';
ERROR: password is easily cracked
ALTER USER user1 PASSWORD 'He123456789';
ERROR: password is easily cracked
ALTER USER user1 PASSWORD 'He@123456789';
ERROR: password is easily cracked
ALTER USER user1 PASSWORD 'Hello@123456';
上面的错误消息 “password is easily cracked” 表示密码强度检查失败。