记MySQL的哈希加密问题导致的远程连接异常:”ERROR 2049 (HY000): Connection using old (pre-4.1.1) authentication protocol refused”

今天折腾mysql的时候,遇到一个问题。我在mac book上下载最新的mysql-5.6.15-osx10.7-x86_64,在连接一个远程的mysql服务器(5.0.77版)时报如下的异常:

[baoniu@zkb-MacbookAir bin]$ mysql -h10.232.41.14 -uazkaban -pazkaban
Warning: Using a password on the command line interface can be insecure.
ERROR 2049 (HY000): Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled)

看字面意思是两边的mysql版本不一致, 使用了mysql 4.1.1之前的授权协议连接时被拒绝。奇怪,本地的版本更新,远程的mysql是5.0.77版也大于4.1.1啊?后来查到在服务器上的密码加密是打开了old_passwords,用的旧的加密方式。

本质原因是:mysql变更过哈希加密的方法,早前是16位以下的,而在4.1以后是更长的hash。

可以测试下:

mysql> SELECT PASSWORD("baoniu");           
+--------------------+
| PASSWORD("baoniu") |
+--------------------+
| 36552eac6dd793f6   | 
+--------------------+
1 row in set (0.00 sec)

这是16位的hash,查看old_password选项的值:

mysql> show variables like '%password%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| old_passwords | ON    | 
+---------------+-------+
1 row in set (0.00 sec)

可以在当前会话里面设置密码格式:

mysql> set old_passwords=0;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like "%password%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| old_passwords | OFF   |
+---------------+-------+
1 row in set (0.01 sec)

现在试下新密码的hash长度:

mysql> select password("baoniu");
+-------------------------------------------+
| password("baoniu")                        |
+-------------------------------------------+
| *64BB8A91878B304CAEBD3141D835ED18531FD69A |
+-------------------------------------------+
1 row in set (0.03 sec)

如果执行

SELECT * FROM mysql.user; 

查看mysql.user表可以发现,长密码和短密码都有。

现在,创建新用户:

 create user 'baoniu' IDENTIFIED BY 'mypassword';

通过

select * from mysql.user order by User; 

可以看到新建用户baoniu的密码hash值是长的。
接着可以授权用户 baoniu 远程登录权限:

Grant all privileges on *.* to 'baoniu'@'%' identified by 'mypassword';

格式:grant 权限 on 数据库名.表名 to 用户@登录主机 identified by “用户密码”; @ 后面是访问mysql的客户端ip地址(或是主机名) % 代表任意的客户端,如果填写 localhost 为本地访问(那此用户就不能远程访问该mysql数据库了)。

flush privileges; 

(让刚才的内容立即生效)

至此,新创建的用户 baoniu 就可以远程登录了,不会再报这个异常信息了。


如果想把老的账号都改用新的hash方式,可以执行:

SELECT Host, User, Password FROM mysql.user WHERE LENGTH(Password) <= 16; (显示密码位数不足的用户)
set old_passwords=0; (关闭老加密方式)
UPDATE mysql.user SET password=PASSWORD('oldpass') WHERE User='olduser'; (更新密码)

参考:
1. MySQL_4.1之后的哈希加密问题
2. mysql-error-2049-hy000-connection-using-old-pre-4-1-1-authentication-protoc

发表评论

电子邮件地址不会被公开。 必填项已用*标注