该 validate_password 组件旨在通过要求账户密码和启用潜在密码强度测试来提高安全性。该组件公开系统变量,以便您配置密码策略,并提供状态变量以监控组件。
该 validate_password 组件实现以下功能:
-
对于将密码作为明文值分配的 SQL 语句,
validate_password会检查密码是否符合当前密码策略,如果密码弱则拒绝密码(语句返回ER_NOT_VALID_PASSWORD错误)。这适用于ALTER USER、CREATE USER和SET PASSWORD语句。 -
对于
CREATE USER语句,validate_password需要提供密码,并且该密码必须满足密码策略。这甚至适用于账户最初被锁定的情况,因为否则在以后解锁账户时将使其变得可访问,而不需要满足策略的密码。 -
validate_password实现了一个VALIDATE_PASSWORD_STRENGTH()SQL 函数,该函数评估潜在密码的强度。该函数采用密码参数,并返回一个从 0(弱)到 100(强)的整数。
对于分配或修改账户密码的语句(ALTER USER、CREATE USER 和 SET PASSWORD),validate_password 能力仅适用于使用内部认证插件存储凭据的账户。对于使用外部认证系统的账户,密码管理必须在外部系统中处理。有关内部凭据存储的更多信息,请参阅 第 8.2.15 节,“密码管理”。
前面的限制不适用于使用 VALIDATE_PASSWORD_STRENGTH() 函数,因为它不直接影响账户。
示例:
-
validate_password检查以下语句中的明文密码。在默认密码策略下,该密码太弱,语句将产生错误:mysql> ALTER USER USER() IDENTIFIED BY 'abc'; ERROR 1819 (HY000): Your password does not satisfy the current policy requirements -
以哈希值指定的密码不被检查,因为原始密码值不可用于检查:
mysql> ALTER USER 'jeffrey'@'localhost' IDENTIFIED WITH mysql_native_password AS '*0D3CED9BEC10A777AEC23CCC353A8C08A633045E'; Query OK, 0 rows affected (0.01 sec) -
该账户创建语句失败,即使账户最初被锁定,因为它不包括满足当前密码策略的密码:
mysql> CREATE USER 'juanita'@'localhost' ACCOUNT LOCK; ERROR 1819 (HY000): Your password does not satisfy the current policy requirements -
要检查密码,请使用
VALIDATE_PASSWORD_STRENGTH()函数:mysql> SELECT VALIDATE_PASSWORD_STRENGTH('weak'); +------------------------------------+ | VALIDATE_PASSWORD_STRENGTH('weak') | +------------------------------------+ | 25 | +------------------------------------+ mysql> SELECT VALIDATE_PASSWORD_STRENGTH('lessweak$_@123'); +----------------------------------------------+ | VALIDATE_PASSWORD_STRENGTH('lessweak$_@123') | +----------------------------------------------+ | 50 | +----------------------------------------------+ mysql> SELECT VALIDATE_PASSWORD_STRENGTH('N0Tweak$_@123!'); +----------------------------------------------+ | VALIDATE_PASSWORD_STRENGTH('N0Tweak$_@123!') | +----------------------------------------------+ | 100 | +----------------------------------------------+
要配置密码检查,请修改名称以 validate_password. 形式的系统变量;这些是控制密码策略的参数。见 第 8.4.3.2 节,“密码验证选项和变量”。xxx
如果 validate_password 未安装,validate_password. 系统变量不可用,语句中的密码不进行检查,并且 xxxVALIDATE_PASSWORD_STRENGTH() 函数始终返回 0。例如,未安装插件时,帐户可以分配少于 8 个字符的密码,或者根本不需要密码。
假设 validate_password 已安装,它实现了三个级别的密码检查:LOW、MEDIUM 和 STRONG。默认为 MEDIUM;要更改此设置,请修改 validate_password.policy 的值。这些策略实施了逐渐严格的密码测试。以下描述引用了默认参数值,这些值可以通过更改相应的系统变量来修改。
-
LOW策略仅测试密码长度。密码必须至少 8 个字符长。要更改此长度,请修改validate_password.length。 -
MEDIUM策略添加了条件,即密码必须包含至少 1 个数字字符、1 个小写字符、1 个大写字符和 1 个特殊(非字母数字)字符。要更改这些值,请修改validate_password.number_count、validate_password.mixed_case_count和validate_password.special_char_count。 -
STRONG策略添加了条件,即密码子串的长度至少 4 个字符不得与字典文件中的单词匹配,如果已经指定了字典文件。要指定字典文件,请修改validate_password.dictionary_file。
此外,validate_password 还支持 capability,拒绝与当前会话的有效用户帐户的用户名部分匹配的密码,或者反之亦然。要控制此 capability,validate_password 暴露了一个 validate_password.check_user_name 系统变量,默认情况下启用该变量。