Client does not support authentication protocol requested by server
Главная » Заметки » База данных MySQL » Client does not support authentication protocol requested by server
Начиная с версии 4.1, в My SQL используется новый протокол аутентификации. В новом протоколе алгоритм хеширования данных аутентификации отличается от алгоритма более ранних версий сервера My SQL. По сути вся проблема сводится к тому, что хеш пароля «mypass» в версиях старше 4.1 (т.е. 4.1.*, 5.0.* и т.д.) имеет вид *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 (строка 41 байта), и тот же пароль «mypass» в версиях младше 4.1. (т.е. 4.0.*, 3.23.* и т.д.) имеет вид 6f8c114b58f2ce9e (строка 16 байт)
Теперь возникает ситуация. Вы обновляете сервер до версии старше 4.1., а клиент у Вас остается старый. Вы все правильно установили, сервер нормально запустился. Вы запускаете клиента, вводите логин и пароль соответствующей учетной записи, нажимаете Enter, Ваш старый клиент хеширует данные авторизации по старому алгоритму и передает их на сервер. Сервер принимает эти данные и сранивает их с данными из таблицы mysql.user. В результате такого сравнения сервер видит, что хеши паролей не совпадают (всего 16 байт, вместо ожидаемых, как минимум, 41-го байта). Вследствие чего, сервер выдает вполне информативное сообщение:
Client does not support authentication protocol requested by server; consider upgrading MySQL client
Чтобы решить возникшую проблему, можно пойти по одному из следующих путей:
- Обновить всех клиентов (их библиотеки) до версии 4.1.1 или старше. Этот вариант идеальный, но не всегда подходит, потому что не для всех приложений существуют соответствующие обновленные библиотеки.
- Создать для «старых» клиентов учетные записи, которые хранят хеш пароля в старом формате.
- Для каждой учетной записи задать хеш пароля в старом формате. Это делается с помощью одной из двух конструкции:
SET PASSWORD FOR 'some_user'@'some_host' = OLD_PASSWORD('newpwd');
UPDATE mysql.user SET Password = OLD_PASSWORD('newpwd') WHERE Host = 'some_host' AND User = 'some_user'; FLUSH PRIVILEGES;
Задать серверу в файле конфигурации (my.ini, my.cnf) директиву, которая указывает серверу использовать старый алгоритм хеширования пароля. Эта директива:
-- old-passwords option
При этом не забудьте, что Вам нужно будет конвертировать хеши паролей из нового формата в старый формат. Это нужно будет сделать для всех учетных записей, у которых хеш пароля уже хранится в новом формате.
Для того, что бы выбрать пользователей, у которых хеши паролей хранятся в новом формате нужно написать запрос вида:
SELECT Host, User, Password FROM mysql.user WHERE LENGTH(Password) > 16;
Далее, для каждого пользователя в полученной таблице вы конвертируете пароль любым из вариантов, предложенным пунктом выше.
Если Вы программируете на языке PHP и версия языка младше версии 5.1, то знайте, что расширение My SQL использует старый протокол аутентификации, т.е. Вам придется работать со старым протоколом аутентификации, и лучше всего перевести сервер в режим старого протокола авторизации. В PHP версий старше 5.1. существует расширение mysqli, которое поддерживает новый протокол аутентификации.
Не забудьте, что таблица mysql.user хранит хеши паролей. Эти хеши получены с помощью алгоритмов необратимого шифрования. Из этого следует, что Вы никогда не узнаете, какой пароль был источником для данного хеша и Вам придется создавать новые пароли для учетных записей. После создания паролей сообщите новые данные учетных записей всем пользователям этих учетных записей.
Рекомендуемые к прочтению разделы документации:
- Section A.2.3, «Client does not support authentication protocol»
- 5.7.9. Password Hashing in MySQL 4.1
Источник — http://phpclub.ru/faq/wakka.php?wakka=MySQLOldPassword