Метод хеширования пароля Mysql, старый по сравнению с новым

Я пытаюсь соединиться с mysql сервером в dreamhost от php документа на получение, расположенного в сервере в slicehost (две различных хостинговых компании). Я должен сделать это так, я могу передать новые данные в slicehost к dreamhost. Используя дамп не опция, потому что структуры таблиц отличаются, и я только должен передать небольшое подмножество данных (100-200 ежедневных записей), проблема состоит в том, что я использую новый метод MySQL Password Hashing в 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 в качестве моста для нормализации данных
  • Уже погугленный это
  • Уже говоривший оба сотрудника поддержки

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

Какая-либо дикая идея?

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> УСТАНОВИЛ ГЛОБАЛЬНЫЙ 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'

Я не корень...

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

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';

было бы хорошее начало?

8
задан OMG Ponies 26 April 2011 в 23:38
поделиться

5 ответов

Yeah, that looks like a toughie. Without cooperation from your hosts or the ability to change password formats or client libraries, you don't have a lot of options.

Honestly, my first choice would be to ditch Dreamhost. That's probably a lot of work, but if they're going to be stuck using old incompatible stuff, it will continue to be problematic.

If that's not an option, what about a joint automated process? You could export the data on the Slicehost side into a CSV file and massage it into whatever format is necessary for Dreamhost, and then upload it to the Dreamhost server. You could have a cron script on the Dreamhost server check periodically for the uploaded file and process it (making sure to move or delete it after it was successfully processed).

2
ответ дан 5 December 2019 в 11:25
поделиться

В некоторых случаях вы все еще можете установить и использовать «новый пароль алгоритма хеширования».
Серверы MySQL 4.1+ могут обрабатывать оба алгоритма входа в систему. Какой из них используется, не зависит от переменной старых паролей. Если MySQL находит хэш длиной 41 символ, начинающийся с *, он использует новую систему. И функция ПАРОЛЬ () также может использовать оба алгоритма. Если поле 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 символа, и вы ничего не сможете с этим поделать (кроме как придираться).

7
ответ дан 5 December 2019 в 11:25
поделиться

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

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

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

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

2
ответ дан 5 December 2019 в 11:25
поделиться

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

1
ответ дан 5 December 2019 в 11:25
поделиться

У меня только что возникла эта проблема, и я смог ее решить.

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

Выполните эти запросы:

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);

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

3
ответ дан 5 December 2019 в 11:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: