当前位置:嗨网首页>书籍在线阅读

10-old-passwords

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

在MySQL 4.1版本之前,PASSWORD函数生成的密码是 16位。4.1以后,MySQL改进了密码算法,生成的函数值变成了41位,如下所示。

MySQL 3.23中执行的结果如下:

mysql> SELECT PASSWORD('mypass');

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

| PASSWORD('mypass') |

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

| 6f8c114b58f2ce9e |

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

MySQL 5.1中执行的结果如下:

mysql> SELECT PASSWORD('mypass');

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

| PASSWORD('mypass')|

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

| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |

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

这样就会出现一个问题,当4.1以后的客户端连接4.1以前的客户端时,没有问题,因为新客户端可以理解新旧两种加密算法。但是反过来,当4.1以前的客户端需要连接4.1以后的服务器时,由于无法理解新的密码算法,发到服务器端的密码还是旧的算法加密后的结果,于是导致在新的服务器上出现下面无法认证的情况:

shell> mysql -h localhost -u root

Client does not support authentication protocol requested

by server; consider upgrading MySQL client

对于这个问题,可以采用以下办法解决。

(1)在服务器端用 OLD_PASSWORD 函数更改密码为旧密码格式,客户端可以进行正常连接:

mysql> SET PASSWORD FOR 'some_user'@'some_host' = OLD_PASSWORD('mypass');

(2)在my.cnf的[mysqld]中增加old-passwords参数并重启服务器,这样新的数据库连接成功之后做的 set password、grant、password()操作后生成的新密码全部变成旧的密码格式。

注意:这个参数只是为了支持 4.1 版本前的客户端才进行设置,但是这将使得新建或者修改的用户密码全部变成旧的格式,降低了系统的安全性。