MySQL 8.0.34密码管理新特性-changed_characters_percentage

##

MySQL 8.0.34密码管理新特性-changed_characters_percentage

1、概述

MySQL 8.0.34为我们带来了新的密码验证参数validate_password.changed_characters_percentage。利用这一点,我们可以控制在validate_password接受用户帐户的新密码之前,用户必须更改的密码的最小字符数。在这篇博客中,我提供了几个场景来展示参数validate_password.changed_characters_percentage如何影响用户密码更改。

2、要求

要做到这一点,我们应该启用“需要密码验证的策略”(在MySQL 8.0.13中引入)。我们可以通过使用参数password_require_current或在创建或更改用户时指定PASSWORD REQUIRE CURRENT来全局允许它。Brain Sumpter在他的帖子MySQL 8:密码验证策略中已经很好地解释了这个话题。我建议您阅读它,以了解更多关于“需要密码验证的政策”在我的例子中,我只是启用了参数**password_require_current **,以便在全局范围内实施“需要密码验证的策略”。

[root@mydb01 ~]# mysql -V mysql Ver 8.0.34 for Linux on x86_64 (MySQL Community Server - GPL) [root@mydb01 ~]# mysql mysql> set persist password_require_current = 1; Query OK, 0 rows affected (0.00 sec) mysql> select @@password_require_current; +----------------------------+ | @@password_require_current | +----------------------------+ | 1 | +----------------------------+ 1 row in set (0.00 sec) mysql> \q

一旦我们启用了password require corrent选项,我们应该在REPLACE子句中提供旧密码。否则,它不允许您更改密码。您将得到以下错误:

mysql> create user jerry@'localhost' identified by 'jerrypwd' password require current; Query OK, 0 rows affected (0.02 sec) mysql> grant all privileges on db01.* to jerry@'localhost'; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) mysql> \q Bye

使用jerry@localhost用户登录并修改密码

[root@mydb01 ~]# mysql -ujerry -p Enter password: mysql> alter user jerry@'localhost' identified by 'jerry123'; ERROR 3892 (HY000): Current password needs to be specified in the REPLACE clause in order to change it.

正确的修改方法是使用replace带现在的密码.

mysql> alter user jerry@'localhost' identified by 'jerry123' replace 'jerrypwd'; Query OK, 0 rows affected (0.01 sec)

注意:对“mysql”系统数据库具有全局创建用户和更新权限的用户仍然可以更改密码,而无需指定当前密码。

3、创建测试环境

我已经在我的测试服务器上安装了MySQL 8.0.34版本,并安装了validate_password组件。

mysql> select @@version, @@version_comment; +-----------+------------------------------+ | @@version | @@version_comment | +-----------+------------------------------+ | 8.0.34 | MySQL Community Server - GPL | +-----------+------------------------------+ 1 row in set (0.00 sec) mysql> INSTALL COMPONENT 'file://component_validate_password'; Query OK, 0 rows affected (0.01 sec) mysql> select @@validate_password.changed_characters_percentage; +---------------------------------------------------+ | @@validate_password.changed_characters_percentage | +---------------------------------------------------+ | 0 | +---------------------------------------------------+ 1 row in set (0.00 sec)

我建议安装validate_password组件,而不是validate_password插件(已弃用)。作为插件安装时,您可能看不到此功能。

补充:如何卸载validate_password组件

UNINSTALL COMPONENT 'file://component_validate_password';
4、测试changed_characters_percentage

我已经将changed_characters_percentage值设置为50。这意味着每当用户试图重置密码时,新密码不应包含任何旧字符的50%。

mysql> set global validate_password.changed_characters_percentage=50; Query OK, 0 rows affected (0.00 sec) mysql> select @@validate_password.changed_characters_percentage; +---------------------------------------------------+ | @@validate_password.changed_characters_percentage | +---------------------------------------------------+ | 50 | +---------------------------------------------------+ 1 row in set (0.00 sec)

然后,我用密码“Cookbook@1234”创建了用户“ckuser”。

mysql> create user ckuser@'localhost' identified by 'Cookbook@1234'; Query OK, 0 rows affected (0.01 sec) mysql> grant select on *.* to ckuser@'localhost'; Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) mysql> \q Bye

现在,我们试着把密码改成’Cookbook@8899‘。

mysql> select user(); +------------------+ | user() | +------------------+ | ckuser@localhost | +------------------+ 1 row in set (0.00 sec) mysql> alter user ckuser@'localhost' identified by 'Cookbook@8899' replace 'Cookbook@1234'; ERROR 4165 (HY000): The new password must have at least '6' characters that are different from the old password. It has only '2' character(s) different. For this comparison, uppercase letters and lowercase letters are considered to be equal.

它不允许我将密码从Cookbook@1234更改为Cookbook@8899 ,这个错误非常清楚地解释了这种情况。我有一个13个字符的密码,而我的新密码只有四个字符差异(Cookbook@1234到Cookbook@8899)。根据我的changed_characters_percentage值,新密码应该包含50%的新字符。这意味着我的新密码应该至少有六个不同的字符(补充:这里只取整数,不作四舍五入。13/2=6)。所以,新密码不符合要求。

让我们再来看一个例子:

mysql> alter user ckuser@'localhost' identified by 'Cookbook!78899' replace 'Cookbook@1234'; ERROR 4165 (HY000): The new password must have at least '6' characters that are different from the old password. It has only '4' character(s) different. For this comparison, uppercase letters and lowercase letters are considered to be equal.

如果不做计算,只是但看字符,那么是有6个不一样的,但是为什么还是错误的呢?并且提示只有4个不一样。这是因为新改的密码这里有重复的。比如两个8和两个9,只能算作一个8和一个9.所以!78899计算为4个。

现在,让我们尝试使用另一个新密码“‘Cookbook!67890’。它与之前的密码有6个不同的字符。

mysql> alter user ckuser@'localhost' identified by 'Cookbook!67890' replace 'Cookbook@1234'; Query OK, 0 rows affected (0.02 sec)
5、它是如何处理大/小写字母的?

注意上面的报错中有一段:

For this comparison, uppercase letters and lowercase letters are considered to be equal.

先说结论:大小写字母被认为是相等的。意味着A和a是一样的

再测试:

为了解释这种情况,我创建了另一个用户“tom”,密码是“TOM@jerry12345”。

mysql> create user tom@'localhost' identified by 'TOM@jerry12345'; Query OK, 0 rows affected (0.02 sec) mysql> grant select on *.* to tom@'localhost'; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.01 sec) mysql> \q Bye

密码有14个字符。因此,我们必须在新密码中至少更改7个字符。我会将密码从’TOM@jerry12345‘更新为‘tom@JERRY12345’。在这种情况下,我将从大写-小写和小写-大写改变8个字符。

mysql> alter user tom@'localhost' identified by 'tom@JERRY12345' replace 'TOM@jerry12345'; ERROR 4165 (HY000): The new password must have at least '7' 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.

报错:0个不同。

6、它是如何处理不同的字符数的?

为了测试这个场景,我创建了一个用户‘tuser1’,密码是‘Pmysql@123’。我们可以测试以下场景。

更多现有字符
更多不存在的字符

6.1、更多现有字符

为了测试这一点,我将密码从’Pmysql@123’更改为“‘Pmysql@123123123123123123123’。(只是在现有密码中添加了6个“123”字符)。

mysql> create user tuser1@'localhost' identified by 'Pmysql@123'; Query OK, 0 rows affected (0.01 sec) mysql> grant select on *.* to tuser1@'localhost'; Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> flush privileges; Query OK, 0 rows affected (0.01 sec) mysql> \q Bye [root@mydb01 ~]# mysql -utuser1 -pPmysql@123 mysql> alter user tuser1@'localhost' identified by 'Pmysql@123123123123123123123' replace 'Pmysql@123'; 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.

该错误报告了“0”个字符的差异,因为123已经存在与以前的密码中,添加非常多的123依然是无效的。

6.2、更多不存在的字符

为了测试这一点,我现在将密码从’Pmysql@123‘更改为’Pmysql@1235566778899’。因此,在这种情况下,我在现有密码中添加了10个新字符。但是,我有五个不存在的字符(5,6,7,8,9),这和上面的8899解释是一个案例。

mysql> alter user tuser1@'localhost' identified by 'Pmysql@1235566778899' replace 'Pmysql@123'; Query OK, 0 rows affected (0.02 sec)

所以,从上面的两个例子来看,密码长度可能不同。但是,它应该满足已更改字符的百分比。

7、结论

MySQL 8有很多安全改进和新的实现,这个特性真的很好,可以改进密码验证,并在更改用户密码时增加更多的安全性。

8、备注

原文:

https://www.percona.com/blog/mysql-8-0-34-improved-password-management-by-defining-the-change-characters-count/

人工翻译后并加入更详细的案例说明


免责声明:

1、本站资源由自动抓取工具收集整理于网络。

2、本站不承担由于内容的合法性及真实性所引起的一切争议和法律责任。

3、电子书、小说等仅供网友预览使用,书籍版权归作者或出版社所有。

4、如作者、出版社认为资源涉及侵权,请联系本站,本站将在收到通知书后尽快删除您认为侵权的作品。

5、如果您喜欢本资源,请您支持作者,购买正版内容。

6、资源失效,请下方留言,欢迎分享资源链接

文章评论

0条评论