• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 密码验证组件

    validate_password组件通过要求提供帐户密码并启用潜在密码的强度测试来提高安全性。该组件提供了使您能够配置密码策略的系统变量以及用于组件监视的状态变量。

    注意

    在MySQL 8.0中,该validate_password插件已重新实现为validate_password组件。(有关服务器组件的一般信息,请参见“ MySQL服务器组件”。)以下说明描述了如何使用组件而不是插件。有关使用的插件形式的说明validate_password,请参阅密码验证插件中的MySQL 5.7参考手册。

    插件形式validate_password仍然可用,但已过时,并将在MySQL的未来版本中删除。使用该插件的MySQL安装应过渡到使用组件。

    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外部凭据系统执行身份验证的帐户,密码管理也必须针对该系统从外部进行处理。有关内部凭据存储的更多信息,请参见“帐户密码管理”。

    前述限制不适用于该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

    如果validate_password未安装,则系统变量不可用,不检查语句中的密码,并且该函数始终返回0。例如,如果未安装插件,则可以为帐户分配少于8个字符的密码,或者根本不分配密码。validate_password.xxxVALIDATE_PASSWORD_STRENGTH()

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

    • LOW策略仅测试密码长度。密码必须至少8个字符长。要更改此长度,请修改validate_password.length
    • MEDIUM策略添加了以下条件:密码必须至少包含1个数字字符,1个小写字符,1个大写字符和1个特殊(非字母数字)字符。要改变这些值,修改validate_password.number_countvalidate_password.mixed_case_countvalidate_password.special_char_count
    • STRONG策略添加了一个条件,即长度为4或更长的密码子字符串必须与字典文件中的单词不匹配(如果已指定)。要指定字典文件,请修改validate_password.dictionary_file

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

    密码验证组件的安装和卸载

    本节介绍如何安装和卸载validate_password密码验证组件。有关安装和卸载组件的一般信息,请参见“ MySQL服务器组件”。

    注意

    如果使用Oracle提供的MySQL Yum存储库, MySQL SLES存储库或 RPM软件包安装MySQL 8.0 ,则validate_password在首次启动MySQL Server之后,默认情况下会启用该组件。

    使用Yum或RPM软件包从5.7升级到MySQL 8.0 validate_password会将插件保留在原处。要从validate_password插件过渡到validate_password组件,

    要由服务器使用,组件库文件必须位于MySQL插件目录(由plugin_dir系统变量命名的目录)中。如有必要,通过设置plugin_dir服务器启动时的值来配置插件目录位置。

    要安装validate_password组件,请使用以下语句:

    INSTALL COMPONENT 'file://component_validate_password';
    

    组件安装是一次性的操作,不需要在每次服务器启动时进行。INSTALL COMPONENT加载组件,并将其注册在mysql.component系统表中,以使其在后续服务器启动期间加载。

    要卸载validate_password组件,请使用以下语句:

    UNINSTALL COMPONENT 'file://component_validate_password';
    

    UNINSTALL COMPONENT卸载组件,然后从mysql.component系统表中注销该组件,以使其在后续服务器启动期间不被加载。

    密码验证选项和变量

    本节介绍提供的系统和状态变量,validate_password以使其能够被配置和监视。

    • 密码验证组件系统变量
    • 密码验证组件状态变量
    • 密码验证插件选项
    • 密码验证插件系统变量
    • 密码验证插件状态变量

    密码验证组件系统变量

    如果validate_password启用了该组件,则它将暴露几个启用密码检查配置的系统变量:

    mysql> SHOW VARIABLES LIKE 'validate_password.%';
    +--------------------------------------	+--------	+
    | Variable_name                         | Value   |
    +--------------------------------------	+--------	+
    | validate_password.check_user_name     | ON      |
    | validate_password.dictionary_file     |         |
    | validate_password.length              | 8       |
    | validate_password.mixed_case_count    | 1       |
    | validate_password.number_count        | 1       |
    | validate_password.policy              | MEDIUM  |
    | validate_password.special_char_count  | 1       |
    +--------------------------------------	+--------	+
    

    要更改密码的检查方式,可以在服务器启动或运行时设置这些系统变量。以下列表描述了每个变量的含义。

    • validate_password.check_user_name

      属性
      命令行格式--validate-password.check-user-name[={OFF|ON}]
      系统变量validate_password.check_user_name
      范围Global
      动态
      SET_VAR提示适用没有
      类型布尔型
      默认值ON

      是否validate_password将密码与当前会话的有效用户帐户的用户名部分进行比较,如果匹配则拒绝。除非validate_password已安装,否则此变量不可用。

      默认情况下validate_password.check_user_name启用。此变量控制用户名匹配,而与的值无关validate_password.policy

      validate_password.check_user_name启用时,它具有以下作用:

      • validate_password调用所有上下文的情况下都会进行检查,包括使用诸如ALTER USER或的语句SET PASSWORD来更改当前用户的密码,以及调用诸如的功能VALIDATE_PASSWORD_STRENGTH()
      • 用于比较的用户名来自当前会话的USER()CURRENT_USER()函数的值。这意味着具有足够特权来设置另一个用户密码的用户可以将密码设置为该用户的名称,而不能将该用户的密码设置为执行该语句的用户的名称。例如,'root'@'localhost'可以设定密码'jeffrey'@'localhost''jeffrey',但不能设置密码'root
      • 仅使用USER()CURRENT_USER()函数值中的用户名部分,而不使用主机名部分。如果用户名为空,则不会进行比较。
      • 如果密码与用户名相同或相反,则发生匹配并且密码被拒绝。
      • 用户名匹配区分大小写。密码和用户名值以字节为单位,以二进制字符串的形式进行比较。
      • 如果密码与用户名匹配,则VALIDATE_PASSWORD_STRENGTH()无论其他validate_password系统变量如何设置,都返回0 。
    • validate_password.dictionary_file

      属性
      命令行格式--validate-password.dictionary-file=file_name
      系统变量validate_password.dictionary_file
      范围Global
      动态
      SET_VAR提示适用没有
      类型文件名

      validate_password用于检查密码的字典文件的路径名。除非validate_password已安装,否则此变量不可用。

      默认情况下,此变量的值为空,并且不执行字典检查。为了进行字典检查,变量值必须为非空。如果文件被命名为相对路径,则会相对于服务器数据目录进行解释。文件内容应为小写,每行一个单词。内容被视为具有的字符集utf8。允许的最大文件大小为1MB。

      对于要在密码检查期间使用的词典文件,密码策略必须设置为2(STRONG);请参阅validate_password.policy系统变量的描述。假设是正确的,将密码长度为4(最多100)的每个子字符串与词典文件中的单词进行比较。任何匹配都会导致密码被拒绝。比较不区分大小写。

      对于VALIDATE_PASSWORD_STRENGTH(),将根据所有策略(包括)检查密码STRONG,因此强度评估包括字典检查,无论其validate_password.policy值如何。

      validate_password.dictionary_file可以在运行时设置,并且分配值将导致在不重新启动服务器的情况下读取命名文件。

    • validate_password.length

      属性
      命令行格式--validate-password.length=#
      系统变量validate_password.length
      范围Global
      动态
      SET_VAR提示适用没有
      类型整数
      默认值8
      最低值0

      validate_password需要密码才能包含的最小字符数。除非validate_password已安装,否则此变量不可用。

      validate_password.length最小值是其他几个相关的系统变量的函数。该值的设置不能小于此表达式的值:

      validate_password.number_count
      + validate_password.special_char_count
      + (2 * validate_password.mixed_case_count)
      

      如果由于前面的约束而validate_password调整的值validate_password.length,它将一条消息写入错误日志。

    • validate_password.mixed_case_count

      属性
      命令行格式--validate-password.mixed-case-count=#
      系统变量validate_password.mixed_case_count
      范围Global
      动态
      SET_VAR提示适用没有
      类型整数
      默认值1
      最低值0

      validate_password如果密码策略为MEDIUM或更强密码,则要求密码具有的最小大小写字符数。除非validate_password已安装,否则此变量不可用。

      对于给定的validate_password.mixed_case_count值,密码必须具有那么多小写字符和那么多大写字符。

    • validate_password.number_count

      属性
      命令行格式--validate-password.number-count=#
      系统变量validate_password.number_count
      范围Global
      动态
      SET_VAR提示适用没有
      类型整数
      默认值1
      最低值0

      validate_password如果密码策略为MEDIUM或更强密码,则要求密码具有的最小数字(数字)字符数。除非validate_password已安装,否则此变量不可用。

    • validate_password.policy

      属性
      命令行格式--validate-password.policy=value
      系统变量validate_password.policy
      范围Global
      动态
      SET_VAR提示适用没有
      类型列举
      默认值1
      有效值

      0

      1

      2

      实施的密码策略validate_password。除非validate_password已安装,否则此变量不可用。

      validate_password.policy影响如何validate_password使用其其他策略设置系统变量,除了根据用户名检查密码(由单独控制)之外validate_password.check_user_name

      validate_password.policy可使用的数值0,1,2,或相应的符号值来指定值LOWMEDIUMSTRONG。下表描述了针对每个策略执行的测试。对于长度测试,所需的长度是validate_password.length系统变量的值。同样,其他测试所需的值由其他变量给出。validate_password.xxx

      政策进行的测试
      0要么LOW长度
      1要么MEDIUM长度;数字,小写/大写和特殊字符
      2要么STRONG长度;数字,小写/大写和特殊字符;字典文件
    • validate_password.special_char_count

      属性
      命令行格式--validate-password.special-char-count=#
      系统变量validate_password.special_char_count
      范围Global
      动态
      SET_VAR提示适用没有
      类型整数
      默认值1
      最低值0

      validate_password如果密码策略为MEDIUM或更强,则要求密码具有的最小非字母数字字符数。除非validate_password已安装,否则此变量不可用。

    密码验证组件状态变量

    如果validate_password启用了该组件,则它将公开提供操作信息的状态变量:

    mysql> SHOW STATUS LIKE 'validate_password.%';
    +-----------------------------------------------	+---------------------	+
    | Variable_name                                  | Value                |
    +-----------------------------------------------	+---------------------	+
    | validate_password.dictionary_file_last_parsed  | 2019 -10 -03 08:33:49  |
    | validate_password.dictionary_file_words_count  | 1902                 |
    +-----------------------------------------------	+---------------------	+
    

    下表描述了每个状态变量的含义。

    • validate_password.dictionary_file_last_parsed

      上次解析字典文件的时间。除非validate_password已安装,否则此变量不可用。

    • validate_password.dictionary_file_words_count

      从字典文件中读取的单词数。除非validate_password已安装,否则此变量不可用。

    密码验证插件选项

    注意

    在MySQL 8.0中,该validate_password插件已重新实现为validate_password组件。该validate_password插件已弃用,并将在MySQL的将来版本中删除。因此,它的选项也被弃用并且将被删除。使用该插件的MySQL安装应过渡到使用组件。

    要控制validate_password插件的激活,请使用以下选项:

    • --validate-password[=value]

      属性
      命令行格式--validate-password[=value]
      类型列举
      默认值ON
      有效值

      ON

      OFF

      FORCE

      FORCE_PLUS_PERMANENT

      此选项控制服务器validate_password在启动时如何加载已弃用的插件。该值应该是可用于插件加载选项的值之一,如“安装和卸载插件”中所述。例如,--validate-password=FORCE_PLUS_PERMANENT告诉服务器在启动时加载插件,并防止在服务器运行时将其删除。

      仅当validate_password插件先前已注册INSTALL PLUGIN或已加载时,此选项才可用--plugin-load-add

    密码验证插件系统变量

    注意

    在MySQL 8.0中,该validate_password插件已重新实现为validate_password组件。该validate_password插件已弃用,并将在MySQL的将来版本中删除。因此,它的系统变量也被弃用并将被删除。使用validate_password组件的相应系统变量;请参阅密码验证组件系统变量。使用该插件的MySQL安装应过渡到使用组件。

    • validate_password_check_user_name

      属性
      命令行格式--validate-password-check-user-name[={OFF|ON}]
      系统变量validate_password_check_user_name
      范围Global
      动态
      SET_VAR提示适用没有
      类型布尔型
      默认值ON

      validate_password不推荐使用此插件系统变量,并将在MySQL的将来版本中将其删除。请改用组件的相应validate_password.check_user_name系统变量validate_password

    • validate_password_dictionary_file

      属性
      命令行格式--validate-password-dictionary-file=file_name
      系统变量validate_password_dictionary_file
      范围Global
      动态
      SET_VAR提示适用没有
      类型文件名

      validate_password不推荐使用此插件系统变量,并将在MySQL的将来版本中将其删除。请改用组件的相应validate_password.dictionary_file系统变量validate_password

    • validate_password_length

      属性
      命令行格式--validate-password-length=#
      系统变量validate_password_length
      范围Global
      动态
      SET_VAR提示适用没有
      类型整数
      默认值8
      最低值0

      validate_password不推荐使用此插件系统变量,并将在MySQL的将来版本中将其删除。请改用组件的相应validate_password.length系统变量validate_password

    • validate_password_mixed_case_count

      属性
      命令行格式--validate-password-mixed-case-count=#
      系统变量validate_password_mixed_case_count
      范围Global
      动态
      SET_VAR提示适用没有
      类型整数
      默认值1
      最低值0

      validate_password不推荐使用此插件系统变量,并将在MySQL的将来版本中将其删除。请改用组件的相应validate_password.mixed_case_count系统变量validate_password

    • validate_password_number_count

      属性
      命令行格式--validate-password-number-count=#
      系统变量validate_password_number_count
      范围Global
      动态
      SET_VAR提示适用没有
      类型整数
      默认值1
      最低值0

      validate_password不推荐使用此插件系统变量,并将在MySQL的将来版本中将其删除。请改用组件的相应validate_password.number_count系统变量validate_password

    • validate_password_policy

      属性
      命令行格式--validate-password-policy=value
      系统变量validate_password_policy
      范围Global
      动态
      SET_VAR提示适用没有
      类型列举
      默认值1
      有效值

      0

      1

      2

      validate_password不推荐使用此插件系统变量,并将在MySQL的将来版本中将其删除。请改用组件的相应validate_password.policy系统变量validate_password

    • validate_password_special_char_count

      属性
      命令行格式--validate-password-special-char-count=#
      系统变量validate_password_special_char_count
      范围Global
      动态
      SET_VAR提示适用没有
      类型整数
      默认值1
      最低值0

      validate_password不推荐使用此插件系统变量,并将在MySQL的将来版本中将其删除。请改用组件的相应validate_password.special_char_count系统变量validate_password

    密码验证插件状态变量

    注意

    在MySQL 8.0中,该validate_password插件已重新实现为validate_password组件。该validate_password插件已弃用,并将在MySQL的将来版本中删除。因此,其状态变量也将被弃用并将被删除。使用validate_password组件的相应状态变量;请参阅密码验证组件状态变量。使用该插件的MySQL安装应过渡到使用组件。

    • validate_password_dictionary_file_last_parsed

      validate_password不推荐使用此插件状态变量,并将在将来的MySQL版本中将其删除。请改用组件的相应validate_password.dictionary_file_last_parsed状态变量validate_password

    • validate_password_dictionary_file_words_count

      validate_password不推荐使用此插件状态变量,并将在将来的MySQL版本中将其删除。请改用组件的相应validate_password.dictionary_file_words_count状态变量validate_password

    过渡到密码验证组件

    注意

    在MySQL 8.0中,该validate_password插件已重新实现为validate_password组件。该validate_password插件已弃用,并将在MySQL的将来版本中删除。

    当前使用该validate_password插件的MySQL安装应过渡到使用该validate_password组件。为此,请使用以下过程。该过程将在卸载插件之前安装组件,以避免出现没有密码验证的时间窗口。(可以同时安装组件和插件。在这种情况下,服务器尝试使用组件,如果组件不可用,则退回到插件。)

    1. 安装validate_password组件:

      INSTALL COMPONENT 'file://component_validate_password';
      
    2. 测试该validate_password组件以确保其按预期工作。如果需要设置任何系统变量,则可以在运行时使用进行设置。(下一步必须对选项文件进行任何更改。)validate_password.xxxSET GLOBAL
    3. 调整对插件系统和状态变量的任何引用,以引用相应的组件系统和状态变量。假设您在启动时使用如下选项文件配置插件:

      [mysqld]
      validate-password=FORCE_PLUS_PERMANENT
      validate_password_dictionary_file=/usr/share/dict/words
      validate_password_length=10
      validate_password_number_count=2
      

      要调整选项文件,请忽略--validate-password选项(它仅适用于插件,不适用于组件),然后修改系统变量引用:

      [mysqld]
      validate_password.dictionary_file=/usr/share/dict/words
      validate_password.length=10
      validate_password.number_count=2
      

      对于在运行时引用validate_password插件系统和状态变量的应用程序,需要进行类似的调整。

    4. 卸载validate_password插件:

      UNINSTALL PLUGIN validate_password;
      

      如果validate_password插件在服务器启动时使用--plugin-load--plugin-load-add选项加载,请在服务器启动过程中忽略该选项。例如,如果该选项在服务器选项文件中列出,则将其从文件中删除。

    5. 重新启动服务器。