C语言学习网

mysql 5.6.25报错ERROR 1372 (HY000): Password hash 的一点思考

发表于:2022-12-07 作者:安全数据网编辑
编辑最后更新 2022年12月07日,问题背景:之前使用的一套mysql 5.6.25,由于一些原因我进行了清除。大家知道我们第二次执行mysql_install_db初始化数据库时,是不会存储root的临时密码。那么要进入mysql数据

问题背景:

之前使用的一套mysql 5.6.25,由于一些原因我进行了清除。大家知道我们第二次执行mysql_install_db初始化数据库时,是不会存储root的临时密码。

那么要进入mysql数据库,就引入如下的一篇文章。

案例过程:

0,以无密码认证方式启动数据库

[root@standbygtid mysql]#nohup mysqld_safe --user=mysql --skip-grant-tables&

1,配置root用户的密码

mysql> set password for 'root'@'localhost'='system';

ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement

2,刷新修改用户密码的操作到mysql.user表

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

3,修改数据库用户密码,提示密码需要41个字节

mysql> set password for 'root'@'localhost'='system';

ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number

4,采用password函数修改用户密码成功

mysql> set password for 'root'@'localhost'=password('system');

Query OK, 0 rows affected (0.00 sec)

5,关闭数据库

[root@standbygtid mysql]#mysqladmin -uroot -psystem shutdown

6,启动数据库

[root@standbygtid mysql]# nohup mysqld_safe --user=mysql&

7,可以用上述配置的数据库用户密码登陆

[root@standbygtid mysql]# mysql -uroot -psystem

Warning: Using a password on the command line interface can be insecure.

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 1

Server version: 5.6.25-enterprise-commercial-advanced MySQL Enterprise Server - Advanced Edition (Commercial)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

8,password函数不管采用的字符串是多少位,产生的字节宽度全是 41

mysql> select password('system'),length(password('system'));

+-------------------------------------------+----------------------------+

| password('system') | length(password('system')) |

+-------------------------------------------+----------------------------+

| *576EE5B74C20E68F2A5A240F3E408E6DE43DD73F | 41 |

+-------------------------------------------+----------------------------+

1 row in set (0.00 sec)

mysql> select password('syste'),length(password('syste'));

+-------------------------------------------+---------------------------+

| password('syste') | length(password('syste')) |

+-------------------------------------------+---------------------------+

| *795AF4045357E7DA27CBF22263514F881880C4AC | 41 |

+-------------------------------------------+---------------------------+

1 row in set (0.00 sec)

9,上述 41字节到底是什么含义呢,查阅mysql 5.6官方文档,上述这个41个字节是和采用密码认证的方法有关系,而

采用密码认证的方法是由系统变量old_passwords控制。

10,old_passwords系统变量的含义

old_passwords控制password函数所使用的密码认证方法,它会影响create user以及grant操作如何产生数据库用户密码。

old_passwords的几个值

值 密码哈希方法 密码哈希方法采用的插件 是否默认值

0 mysql 4.1版本采用的哈希方法 mysql_native_password 是

1 mysql 4.1之前的哈希方法 sha256_password

2 sha-256哈希方法 sha256_password

11,可见不同的old_password的值,会影响password函数产生的值的宽度

mysql> set old_passwords=0;

Query OK, 0 rows affected (0.00 sec)

mysql> select password('syste'),length(password('syste'));

+-------------------------------------------+---------------------------+

| password('syste') | length(password('syste')) |

+-------------------------------------------+---------------------------+

| *795AF4045357E7DA27CBF22263514F881880C4AC | 41 |

+-------------------------------------------+---------------------------+

1 row in set (0.00 sec)

mysql> set old_passwords=1;

Query OK, 0 rows affected (0.00 sec)

mysql> select password('syste'),length(password('syste'));

+-------------------+---------------------------+

| password('syste') | length(password('syste')) |

+-------------------+---------------------------+

| 46acda267e174d58 | 16 |

+-------------------+---------------------------+

1 row in set (0.00 sec)

mysql> set old_passwords=2;

Query OK, 0 rows affected (0.00 sec)

mysql> select password('syste'),length(password('syste'));

+----------------------------------------------------------------------+---------------------------+

| password('syste') | length(password('syste')) |

+----------------------------------------------------------------------+---------------------------+

| $5$\]^D8P`aMt\vp2Pu$lDCzMsToPBl56CdhB2pjetpvqEiL9BMhdt1TDbMbzL6 | 68 |

+----------------------------------------------------------------------+---------------------------+

1 row in set (0.01 sec)

12,上述old_passwords的不同值是对应于下述不同的插件

mysql> show plugins;

+----------------------------+----------+--------------------+---------+-------------+

| Name | Status | Type | Library | License |

+----------------------------+----------+--------------------+---------+-------------+

| mysql_native_password | ACTIVE | AUTHENTICATION | NULL | PROPRIETARY |

| mysql_old_password | ACTIVE | AUTHENTICATION | NULL | PROPRIETARY |

| sha256_password | ACTIVE | AUTHENTICATION | NULL | PROPRIETARY |

13,如果你想指定数据库在启动或创建时的默认的用户密码认证插件

这个插件是对应上述show plugins的值,而没有对应的系统变量,只有选项,见下

--default-authentication-plugin

可选值:

mysql_native_password 默认值

sha256_password

可以在启动数据库时在命令行上指定或者在配置文件中指定这个选项

14,如果在升级mysql时,一定要好好考量old_password的值或者--default-authentication-plugin,否则旧版本的mysql

客户端可能会登陆不上升级后的mysql数据库。

思考总结:

  • 1,出现问题,根据错误提示进行字面意思分析

  • 2,出现问题,在官方手册查询对应出错语句的语法,可以获取进一步的诊断信息或线索

  • 3,提出的问题,一定要放在一个大的背景下,就是要向业务服务,你的业务的目标是什么,比如:数据库用户的可靠性及安全性,数据库马上要升级吗,数据库的性能,等等。

  • 4,数据库的学习是一个迭代式的过程,有些知识,不是一下子可以全面了解的,需要从字面或其它的技术反向进行进一步的掌握

大家可以关注我的微信公众号,每天会定期发送一些数据库相关的文章,欢迎交流。

0