mysql用户root多密码成因

来源:互联网 发布:java程序设计流程图 编辑:程序博客网 时间:2024/06/05 14:10

      今天,登陆某服务器时,突然注意到一个怪异的现象,mysql数据库mysql.user表中root用户居然有两个密码(见下图),难道一个账号可以通过两个密码登陆?带着这个疑问,翻阅了一些资料后,终于明白一些。



      首先,了解下mysql用户密码加密的相关知识,mysql以4.1版本为分界线,之前使用mysql323加密,之后使用mysqlsha1加密。

mysql323加密:(16位),使用old_passwd()函数加密



mysqlsha1加密:(去掉*号40位),使用passwd()函数加密



然后,熟悉下常用的更改用户密码的命令
方法1: 用SET PASSWORD命令
首先登录MySQL。
格式:mysql> set password for 用户名@localhost = password('新密码');
例子:mysql> set password for root@localhost = password('123');

方法2:用mysqladmin
格式:mysqladmin -u用户名 -p旧密码 password 新密码
例子:mysqladmin -uroot -p123456 password 123

方法3:用UPDATE直接编辑user表
首先登录MySQL。
mysql> use mysql;
mysql> update user set password=password('123') where user='root' and host='localhost';
mysql> flush privileges; 

实验环境为mysql5,mysql数据库root密码初始为123456,更改为1234567后,出现了与文中开始相同的情景。 



我们对上述情况进行命令测试:

#mysql -uroot -h localhost -p123456             #不能登陆#mysql -uroot -h 127.0.0.1 -p123456             #不能登陆#mysql -uroot -h localhost -p1234567            #登陆成功#mysql -uroot -h 127.0.0.1 -p1234567            #登陆成功 

反之,当我们设置环境初始密码为123456,随后我们使用命令
mysql>set password root@127.0.0.1=password('1234567');
将下面的记录password更改为1234567后,我们发现使用密码1234567并不能成功登陆,而使用密码123456可以登陆成功。


原因:

因为mysql在验证用户时,先对user表进行排序:

1、specified的host排在pattern的host前面。

2、相同host的条目,specified的user排在anonymous的前面。

3、其他按默认存储顺序。

排序结束后,从第一条开始匹配,如果匹配符合,则忽略剩下所有。


所以:

对于mysql而言user字段中,localhost与127.0.0.1是完全等价的,当排序结束后,password字段的值排在前面的,就是localhost与127.0.0.1的密码密文,下面的密文自动忽略,可视为无效数据。因此,文中初始的描述的情况,密码就是第一条password记录的值。



原创粉丝点击