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
功能仅适用于使用身份验证插件的帐户,这些插件将凭据存储在 MySQL 内部。对于使用插件针对 MySQL 外部的凭据系统执行身份验证的帐户,必须针对该系统在外部处理密码管理。有关内部凭据存储的更多信息,请参见 第 8.2.15 节“密码管理”。
前面的限制不适用于使用 VALIDATE_PASSWORD_STRENGTH()
函数,因为它不会直接影响帐户。
示例
validate_password
检查以下语句中的明文密码。在默认密码策略下(要求密码长度至少为 8 个字符),密码强度较弱,并且该语句会产生错误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.
系统变量不可用,语句中的密码不会被检查,并且 xxx
VALIDATE_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
还支持拒绝与当前会话的有效用户帐户的用户名部分匹配(正向或反向)的密码的功能。为了控制此功能,validate_password
提供了一个 validate_password.check_user_name
系统变量,该变量默认情况下处于启用状态。