PostgreSQL 教程: 密码强度检查

八月 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

passwordcheckMakefile中注释的两行还原,然后重新构建模块。

# 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” 表示密码强度检查失败。