Метод хэширования пароля Mysql old vs new

Я пытаюсь подключиться к серверу mysql в dreamhost из скрипта php, расположенного на сервере slicehost (две разные хостинговые компании). Мне нужно сделать это, чтобы я мог передавать новые данные на slicehost в dreamhost. Использование дампа не является вариантом, потому что структуры таблиц различны, и мне нужно только передать небольшой поднабор данных (100-200 ежедневных записей). Проблема в том, что я использую новый метод Хеширования пароля MySQL на slicehost, а dreamhost использует старый, так что я получаю

$link = mysql_connect($mysqlHost, $mysqlUser, $mysqlPass, FALSE); Warning: mysql_connect() [function.mysql-connect]: OK packet 6 bytes shorter than expected Warning: mysql_connect() [function.mysql-connect]: mysqlnd cannot connect to MySQL 4.1+ using old authentication Warning: mysql_query() [function.mysql-query]: Access denied for user 'nodari'@'localhost' (using password: NO) 

факты:

  • Мне нужно продолжить использование нового метода в slicehost, и я не могу использовать более старую версию / библиотеку php
  • База данных слишком велика, чтобы переносить ее каждый день с помощью дампа
  • Даже если я это сделал, таблицы имеют разные структуры
  • Мне нужно скопировать только небольшой подмножество, ежедневно (только изменения дня, 100-200 записей)
  • Поскольку таблицы настолько разные, мне нужно использовать php в качестве моста для нормализации данных
  • Уже отправлено в Google
  • Уже разговаривали с обоими опорами

Более очевидным вариантом для меня было бы начать использовать новый метод HTML Password Hashing в dreamhost, но они не изменят его, и я не root, поэтому я не могу сделать это сам.

Любая дикая идея?

По VolkerK sugestion:

 mysql> SET SESSION old_passwords=0; Query OK, 0 rows affected (0.01 sec) mysql> SELECT @@global.old_passwords,@@session.old_passwords, Length(PASSWORD('abc')); +------------------------+-------------------------+-------------------------+ | @@global.old_passwords | @@session.old_passwords | Length(PASSWORD('abc')) | +------------------------+-------------------------+-------------------------+ | 1 | 0 | 41 | +------------------------+-------------------------+-------------------------+ 1 row in set (0.00 sec) 

Очевидным теперь будет запуск mysql> SET GLOBAL old_passwords = 0; Но мне нужно СУПЕР-привилегия сделать это, и они не дадут мне это

если я запустил запрос

 SET PASSWORD FOR 'nodari'@'HOSTNAME' = PASSWORD('new password'); 

Я получаю ошибку

 ERROR 1044 (42000): Access denied for user 'nodari'@'67.205.0.0/255.255.192.0' to database 'mysql' 

Я не root …

Парень в поддержке dreamhost настаивает на том, что проблема в моем конце. Но он сказал, что выполнит любой запрос, который я ему скажу, поскольку это частный сервер. Итак, я должен сказать этому парню ТОЧНО, что бежать. Поэтому, говоря ему, чтобы он бежал

 SET SESSION old_passwords=0; SET GLOBAL old_passwords=0; SET PASSWORD FOR 'nodari'@'HOSTNAME' = PASSWORD('new password'); grant all privileges on *.* to nodari@HOSTNAME identified by 'new password'; 

было бы хорошим началом?

Solutions Collecting From Web of "Метод хэширования пароля Mysql old vs new"

Да, это выглядит как жесткая. Без сотрудничества со своими хостами или с возможностью изменения форматов паролей или клиентских библиотек у вас не так много вариантов.

Честно говоря, моим первым выбором было бы расколоть Dreamhost. Это, наверное, много работы, но если они будут застревать с использованием старого несовместимого материала, это будет оставаться проблематичным.

Если это не вариант, как насчет совместного автоматизированного процесса? Вы можете экспортировать данные со стороны Slicehost в CSV-файл и массировать его в любой формат, необходимый для Dreamhost, а затем загрузить его на сервер Dreamhost. У вас может быть скрипт cron на сервере Dreamhost периодически проверять загруженный файл и обрабатывать его (обязательно переместите или удалите его после его успешной обработки).

В некоторых случаях вы все равно сможете установить и использовать «новый пароль алгоритма хэширования».
Серверы MySQL 4.1+ могут обрабатывать оба логических алгоритма. Какой из них не зависит от переменной old-passwords. Если MySQL найдет длинный хэш на 41 символ, начинающийся с *, он использует новую систему. Функция PASSWORD () также может использовать оба алгоритма. Если поле mysql.user.Password достаточно велико, чтобы хранить 41 символ, а переменная old-passwords – 0, он создаст «новый» пароль. Документация для old_passwords говорит о Variable Scope Both поэтому вы можете изменить ее для своей сессии.
Подключитесь к серверу MySQL (с клиентом, который может это сделать, несмотря на глобальные old_passwords = 1), например HeidiSQL, и попробуйте следующее:

 SET SESSION old_passwords=0; SELECT @@global.old_passwords,@@session.old_passwords, Length(PASSWORD('abc')); 

Если он печатает 1, 0, 41 (это означает, что глобальные old_passwords включены, но для сеанса он выключен, а PASSWORD () возвращает «новый» пароль), вы должны иметь возможность установить новый пароль, используя новый алгоритм для своей учетной записи в пределах той же сессии.

Но если dreamhost действительно хочет отключить новый алгоритм паролей, то в поле mysql.user.Password будет меньше 41 символа, и вы ничего не сможете с ним поделать (за исключением того, что они не навязывают).

У меня была эта проблема, и я смог ее обойти.

Во-первых, подключитесь к базе данных MySQL с более старым клиентом, который не возражает против old_passwords. Соединитесь с пользователем, который будет использовать ваш скрипт.

Запустите эти запросы:

 SET SESSION old_passwords=FALSE; SET PASSWORD = PASSWORD('[your password]'); 

В своем скрипте PHP измените функцию mysql_connect, чтобы включить флаг клиента 1:

 define('CLIENT_LONG_PASSWORD', 1); mysql_connect('[your server]', '[your username]', '[your password]', false, CLIENT_LONG_PASSWORD); 

Это позволило мне успешно подключиться.

Я решил бы это, сбросив данные на Slicehost, используя SELECT ... INTO OUTFILE .

Это позволяет вам спроектировать ваш запрос, чтобы убедиться, что вывод находится в формате, соответствующем структуре таблицы на целевом сайте.

Затем LOAD DATA INFILE файл дампа в Dreamhost и используйте LOAD DATA INFILE .

Как в стороне, Dreamhost действительно использует MySQL 4.0? Они чрезвычайно устарели – даже расширенная поддержка MySQL 4.1 истекает в этом месяце (декабрь 2009 г.).

Я думаю, вы должны сделать WebServices / RPC из slicehost и написать соответствующую службу для обработки.

Я была такая же проблема. Чтобы решить эту проблему, я сделал следующее:

 SET PASSWORD = PASSWORD('[your password]');