Welcome to php club

PHP FAQ from PHPclub.ru: MySQLOldPassword ...

Начало | Каталог | Изменения | НовыеКомментарии | Вам запрещён доступПользователи | Вам запрещён доступРегистрация | Вход:  Пароль:  

My SQL

Ошибка при подключении к серверу: Client does not support authentication protocol


Начиная с версии 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. Для каждой учетной записи задать хеш пароля в старом формате. Это делается с помощью одной из двух конструкции:
    1. SET PASSWORD FOR 'some_user'@'some_host' = OLD_PASSWORD('newpwd');
    2. UPDATE mysql.user SET Password = OLD_PASSWORD('newpwd') WHERE Host = 'some_host' AND User = 'some_user';
      FLUSH PRIVILEGES;
  4. Задать серверу в файле конфигурации (my.ini, my.cnf) директиву, которая указывает серверу использовать старый алгоритм хеширования пароля. Эта директива:
    -- old-passwords option

    При этом не забудьте, что Вам нужно будет конвертировать хеши паролей из нового формата в старый формат. Это нужно будет сделить для всех учетных записей, у которых хеш пароля уже хранится в новом формате.
    Для того, что бы выбрать пользователей, у которых хеши паролей хранятся в новом формате нужно написать запрос вида:
    SELECT Host, UserPassword FROM mysql.user WHERE LENGTH(Password) > 16;

    Далее, для каждого пользователя в полученной таблице вы конвертируете пароль любым из вариантов, предложенным пунктом выше.

NB:

  1. Если Вы программируете на языке PHP и версия языка младше версии 5.1, то знайте, что расширение My SQL использует старый протокол аутентификации, т.е. Вам придется работать со старым протоколом аутентификации, и лучше всего перевести сервер в режим старого протокола авторизации. В PHP версий старше 5.1. существует расширение mysqli, которое поддерживает новый протокол аутентификации.
  2. Не забудьте, что таблица mysql.user хранит хеши паролей. Эти хеши получены с помощью алгоритмов необратимого шифрования. Из этого следует, что Вы никогда не узнаете, какой пароль был источником для данного хеша и Вам придется создавать новые пароли для учетных записей. После создания паролей сообщите новые данные учетных записей всем пользователям этих учетных записей.
  3. Рекомендуемые к прочтению разделы документации:
    1. Section A.2.3, “Client does not support authentication protocol”
    2. 5.7.9. Password Hashing in MySQL 4.1

 
Комментариев нет. [Показать комментарии/форму]