### 6.4.3 密码验证组件

[6.4.3.1 密码验证组件安装和卸载](validate-password-installation.html)
[6.4.3.2 密码验证选项和变量](validate-password-options-variables.html)
[6.4.3.3 转换到密码验证组件](validate-password-transitioning.html)

[](<>)[](<>)[](<>)[](<>)

这`验证密码`组件通过要求帐户密码和启用潜在密码的强度测试来提高安全性。此组件公开系统变量，使您能够配置密码策略和组件监控的状态变量。

笔记

在 MySQL 8.0 中，`验证密码`插件被重新实现为`验证密码`零件。（有关组件的一般信息，请参阅[第 5.5 节，“MySQL 组件”](components.html).) 以下说明描述了如何使用组件，而不是插件。有关使用插件形式的说明`验证密码`， 看[密码验证插件](https://dev.mysql.com/doc/refman/5.7/en/validate-password.html)， 在[MySQL 5.7 参考手册](https://dev.mysql.com/doc/refman/5.7/en/).

插件形式`验证密码`仍然可用，但已弃用；希望它在 MySQL 的未来版本中被删除。使用该插件的 MySQL 安装应该转换为使用该组件。看[第 6.4.3.3 节，“转换到密码验证组件”](validate-password-transitioning.html).

这`验证密码`组件实现了这些功能：

-   对于分配作为明文值提供的密码的 SQL 语句，`验证密码`根据当前密码策略检查密码，如果密码弱则拒绝密码（语句返回[`ER_NOT_VALID_PASSWORD`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_not_valid_password)错误）。这适用于[`更改用户`](alter-user.html),[`创建用户`](create-user.html)， 和[`设置密码`](set-password.html)陈述。

-   为了[`创建用户`](create-user.html)陈述，`验证密码`要求提供密码，并且满足密码策略。即使帐户最初被锁定也是如此，否则稍后解锁帐户会导致无需满足策略的密码即可访问该帐户。

-   `验证密码`实现一个[`VALIDATE_PASSWORD_STRENGTH()`](encryption-functions.html#function_validate-password-strength)评估潜在密码强度的 SQL 函数。此函数接受密码参数并返回一个从 0（弱）到 100（强）的整数。

笔记

对于分配或修改帐户密码的语句（[`更改用户`](alter-user.html),[`创建用户`](create-user.html)， 和[`设置密码`](set-password.html)）， 这`验证密码`此处描述的功能仅适用于使用身份验证插件的帐户，该插件在内部将凭据存储到 MySQL。对于使用针对 MySQL 外部凭证系统执行身份验证的插件的帐户，密码管理也必须在外部针对该系统进行处理。有关内部凭据存储的更多信息，请参阅[第 6.2.15 节，“密码管理”](password-management.html).

上述限制不适用于使用[`VALIDATE_PASSWORD_STRENGTH()`](encryption-functions.html#function_validate-password-strength)功能，因为它不直接影响帐户。

例子：

-   `验证密码`检查以下语句中的明文密码。在要求密码长度至少为 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()`](encryption-functions.html#function_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 |
    +----------------------------------------------+
    ```

    要配置密码检查，请修改具有表单名称的系统变量`验证密码。*`xxx`*`; 这些是控制密码策略的参数。看见[第6.4.3.2节，“密码验证选项和变量”](validate-password-options-variables.html).

    如果`验证密码`如果未安装，则`验证密码*`xxx`*`系统变量不可用，未检查语句中的密码，并且[`验证密码强度（）`](encryption-functions.html#function_validate-password-strength)函数总是返回0。例如，在没有安装插件的情况下，可以为帐户分配少于8个字符的密码，或者根本没有密码。

    假设`验证密码`安装后，它会执行三个级别的密码检查：`低的`,`中等的`和`坚强的`.默认值为`中等的`; 若要更改此值，请修改[`验证密码。政策`](validate-password-options-variables.html#sysvar_validate_password.policy).这些政策实施了越来越严格的密码测试。以下描述涉及默认参数值，可通过更改适当的系统变量来修改。

-   `低的`策略只测试密码长度。密码长度必须至少为8个字符。要更改此长度，请修改[`验证密码。长`](validate-password-options-variables.html#sysvar_validate_password.length).

-   `中等的`策略添加了密码必须至少包含1个数字字符、1个小写字符、1个大写字符和1个特殊（非字母）字符的条件。要更改这些值，请修改[`验证密码。计数`](validate-password-options-variables.html#sysvar_validate_password.number_count), [`验证密码。混合病例数`](validate-password-options-variables.html#sysvar_validate_password.mixed_case_count)和[`验证密码。特殊字符计数`](validate-password-options-variables.html#sysvar_validate_password.special_char_count).

-   `坚强的`策略添加了一个条件，即长度为4或更长的密码子字符串不得与字典文件中的单词匹配（如果已指定）。要指定字典文件，请修改[`验证密码。字典文件`](validate-password-options-variables.html#sysvar_validate_password.dictionary_file).

    此外`验证密码`支持拒绝与当前会话的有效用户帐户的用户名部分匹配的密码的功能，可以是正向的，也可以是反向的。为了控制这种能力，`验证密码`暴露出[`验证密码。检查用户名称`](validate-password-options-variables.html#sysvar_validate_password.check_user_name)系统变量，默认情况下已启用。
