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

Чтобы решить возникшую проблему, можно пойти по одному из следующих путей:

  1. Обновить всех клиентов (их библиотеки) до версии 4.1.1 или старше. Этот вариант идеальный, но не всегда подходит, потому что не для всех приложений существуют соответствующие обновленные библиотеки.
  2. Создать для «старых» клиентов учетные записи, которые хранят хеш пароля в старом формате.
  3. Для каждой учетной записи задать хеш пароля в старом формате. Это делается с помощью одной из двух конструкции:
    • 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 хранит хеши паролей. Эти хеши получены с помощью алгоритмов необратимого шифрования. Из этого следует, что Вы никогда не узнаете, какой пароль был источником для данного хеша и Вам придется создавать новые пароли для учетных записей. После создания паролей сообщите новые данные учетных записей всем пользователям этих учетных записей.

Рекомендуемые к прочтению разделы документации:

Источникhttp://phpclub.ru/faq/wakka.php?wakka=MySQLOldPassword