6.4.3 密码验证插件

validate_password插件可通过要求 Importing 帐户密码并启用潜在密码的强度测试来提高安全性。该插件公开了一组系统变量,使您可以配置密码策略。

validate_password插件实现以下功能:

  • 对于分配了以明文值提供的密码的 SQL 语句,validate_password对照当前密码策略检查密码,如果密码弱,则拒绝该密码(该语句返回ER_NOT_VALID_PASSWORD错误)。这适用于ALTER USERCREATE USERGRANTSET PASSWORD语句,以及作为PASSWORD()和函数的参数给出的密码。

  • 对于CREATE USER语句,validate_password要求提供密码,并且满足密码策略。即使最初锁定了一个帐户也是如此,因为否则以后再解锁该帐户将导致无需密码即可使用该策略即可对其进行访问。

  • validate_password实现了VALIDATE_PASSWORD_STRENGTH() SQL 函数,用于评估潜在密码的强度。此函数接受密码参数,并返回从 0(弱)到 100(强)的整数。

Note

对于分配,修改或生成帐户密码(ALTER USERCREATE USERGRANTSET PASSWORD的语句;使用PASSWORD()的语句),此处描述的validate_password功能仅适用于使用身份验证插件(在 MySQL 内部存储凭据)的帐户。使用对 MySQL 外部凭据系统执行身份验证的插件,密码 Management 也必须针对该系统在外部进行处理。有关内部凭据存储的更多信息,请参见第 6.2.11 节“密码 Management”

前面的限制不适用于VALIDATE_PASSWORD_STRENGTH()功能,因为它不会直接影响帐户。

Examples:

  • 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
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_xxx的系统变量;这些是控制密码策略的参数。参见第 6.4.3.2 节“密码验证插件选项和变量”

如果未安装validate_password,则validate_password_xxx系统变量不可用,不检查语句中的密码,并且VALIDATE_PASSWORD_STRENGTH()函数始终返回 0.例如,在未安装插件的情况下,可以为帐户分配少于 8 个字符的密码,或者不指定密码完全没有

假设已安装validate_password,它将实现三个级别的密码检查:LOWMEDIUMSTRONG。默认值为MEDIUM;要更改此设置,请修改validate_password_policy的值。这些策略实施越来越严格的密码测试。以下描述涉及默认参数值,可以通过更改适当的系统变量来对其进行修改。

另外,从 MySQL 5.7.15 开始,validate_password支持拒绝与当前会话的有效用户帐户的用户名部分匹配的密码的功能,无论是正向还是反向。为了提供对此功能的控制,validate_password公开了一个validate_password_check_user_name系统变量,该变量默认情况下处于启用状态。