文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  密码验证组件

8.4.3 密码验证组件

validate_password 组件通过要求帐户密码并启用对潜在密码的强度测试来提高安全性。此组件公开了系统变量,您可以使用这些变量来配置密码策略,以及用于组件监控的状态变量。

validate_password 组件实现了以下功能

  • 对于将以明文值提供的密码分配给帐户的 SQL 语句,validate_password 会根据当前密码策略检查密码,如果密码强度较弱,则拒绝该密码(该语句返回 ER_NOT_VALID_PASSWORD 错误)。这适用于 ALTER USERCREATE USERSET PASSWORD 语句。

  • 对于 CREATE USER 语句,validate_password 要求提供密码,并且该密码必须满足密码策略。即使帐户最初被锁定,也是如此,因为否则在以后解锁帐户时,将导致帐户在没有满足策略的密码的情况下即可访问。

  • validate_password 实现了 VALIDATE_PASSWORD_STRENGTH() SQL 函数,该函数可评估潜在密码的强度。此函数接受一个密码参数,并返回一个介于 0(弱)到 100(强)之间的整数。

注意

对于分配或修改帐户密码的语句(ALTER USERCREATE USERSET 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.xxx 的系统变量;这些是控制密码策略的参数。请参见 第 8.4.3.2 节“密码验证选项和变量”

如果未安装 validate_password,则 validate_password.xxx 系统变量不可用,语句中的密码不会被检查,并且 VALIDATE_PASSWORD_STRENGTH() 函数始终返回 0。例如,如果未安装插件,则可以为帐户分配长度小于 8 个字符的密码,甚至可以不设置密码。

假设已安装 validate_password,它实现了三个级别的密码检查:LOWMEDIUMSTRONG。默认值为 MEDIUM;要更改此设置,请修改 validate_password.policy 的值。这些策略实施了越来越严格的密码测试。以下描述指的是默认参数值,可以通过更改相应的系统变量来修改这些值。

此外,validate_password 还支持拒绝与当前会话的有效用户帐户的用户名部分匹配(正向或反向)的密码的功能。为了控制此功能,validate_password 提供了一个 validate_password.check_user_name 系统变量,该变量默认情况下处于启用状态。