爱可生开源社区出品。
MySQL 8.0.34 为我们带来了新的密码验证参数 .。使用此功能,我们可以控制在 接受用户帐户的新密码之前用户必须更改的密码中的最小字符数。本文中,提供了一些场景,展示了参数 . 如何影响用户密码更改。
要求
为了实现这一点,我们应该启用 “密码验证策略”(在 MySQL 8.0.13 中引入)。我们可以通过使用参数 rent 或在创建或更改用户时指定 来全局允许它。Brain 在他的文章 MySQL 8:密码验证策略 中已经很好地解释了这个主题。我建议您阅读它以了解有关 “密码验证策略” 的更多信息。就我而言,我只是启用了参数 rent 来全局强制执行 “密码验证策略”。
percona labs MySQL 8.0.34 > set persist password_require_current = 1;
Query OK, 0 rows affected (0.05 sec)
percona labs MySQL 8.0.34 > select @@password_require_current;
+-----------------------------------+
| @@password_require_current |
+-----------------------------------+
| 1 |
+-----------------------------------+
1 row in set (0.00 sec)
一旦我们启用 rent 选项,我们应该在 子句中提供旧密码。否则,它将不允许更改密码。将收到以下错误:
percona labs MySQL 8.0.34 > alter user 'test'@'localhost' identified by 'Test@321';
ERROR 3892 (HY000): Current password needs to be specified in the REPLACE clause in order to change it.
注意:对系统数据库 mysql 库具有全局 USER 和 权限的用户仍然可以更改密码,而无需指定当前密码。
创建测试环境
在测试服务器中安装了 MySQL 8.0.34 版本,并安装了 组件。
percona labs MySQL 8.0.34 > select @@version, @@version_comment;
+-------------+--------------------------------------+
| @@version | @@version_comment |
+-------------+--------------------------------------+
| 8.0.34 | MySQL Community Server - GPL |
+-------------+--------------------------------------+
1 row in set (0.00 sec)
percona labs MySQL 8.0.34 > INSTALL COMPONENT 'file://component_validate_password';
Query OK, 0 rows affected (0.00 sec)
percona labs MySQL 8.0.34 > select @@validate_password.changed_characters_percentage;
+----------------------------------------------------------------+
| @@validate_password.changed_characters_percentage |
+----------------------------------------------------------------+
| 0 |
+----------------------------------------------------------------+
1 row in set (0.00 sec)
我建议安装 组件 而不是 插件(已弃用)。将其安装为插件时您可能看不到此功能。
测试
已将 值设置为 50。这意味着每当用户尝试重置密码时,新密码不应包含任何旧字符的 50%。
percona labs MySQL 8.0.34 > set global validate_password.changed_characters_percentage=50;
Query OK, 0 rows affected (0.00 sec)
percona labs MySQL 8.0.34 > select @@validate_password.changed_characters_percentage;
+----------------------------------------------------------------+
| @@validate_password.changed_characters_percentage |
+----------------------------------------------------------------+
| 50 |
+----------------------------------------------------------------+
1 row in set (0.00 sec)
然后mysql改密码,我创建了用户 ,密码为 @321。
percona labs MySQL 8.0.34 > create user 'percona1'@'localhost' identified by 'Percona@321';
Query OK, 0 rows affected (0.00 sec)
percona labs MySQL 8.0.34 > grant select on *.* to 'percona1'@'localhost';
Query OK, 0 rows affected (0.00 sec)
percona labs MySQL 8.0.34 > flush privileges;
Query OK, 0 rows affected (0.01 sec)
现在,让我们尝试将密码更改为 @567。
percona labs MySQL 8.0.34 > select user();
+--------------------+
| user() |
+--------------------+
| percona1@localhost |
+--------------------+
1 row in set (0.00 sec)
percona labs MySQL 8.0.34 > alter user percona1@localhost identified by 'Percona@567' replace 'Percona@321';
ERROR 4165 (HY000): The new password must have at least '5' characters that are different from the old password. It has only '3' character(s) different. For this comparison, uppercase letters and lowercase letters are considered to be equal.
它不允许我将密码从 @321 更改为 @567,并且该错误非常清楚地解释了情况。我的密码有 11 个字符,而我的新密码只有三个字符差异(@321 到 @567 )。根据我的 值,新密码应包含 50% 的新字符。这意味着我的新密码应至少包含五个不同的字符。因此mysql改密码,新密码不符合要求。
现在,让我们尝试使用另一个新密码 %#567。它与之前的密码有五个不同的字符。
percona labs MySQL 8.0.34 > alter user percona1@localhost identified by 'Percona%#567' replace 'Percona@321';
Query OK, 0 rows affected (0.01 sec)
只要满足要求就可以正常工作!
它如何处理大小写字母?
为了解释这种情况,我创建了另一个用户 ,密码为 @321。
percona labs MySQL 8.0.34 > create user 'percona2'@'localhost' identified by 'PERCONa@321';
Query OK, 0 rows affected (0.00 sec)
密码有 11 个字符。因此,我们必须在新密码中至少更改五个字符。我会将密码从 @321 更新为 @321。在本例中,我将更改大小写和小写的七个字符。
percona labs MySQL 8.0.34 > alter user percona2@localhost identified by 'perconA@321' replace 'PERCONa@321';
ERROR 4165 (HY000): The new password must have at least '5' characters that are different from the old password. It has only '0' character(s) different. For this comparison, uppercase letters and lowercase letters are considered to be equal.
不工作。它无法更改,因为大写字母和小写字母被视为相同。
如何处理不同的字符数?
为了测试这个场景,我创建了一个用户 ,密码为 @321。我们可以测试以下场景。