Mysql密码哈希方法旧vs新

时间:2009-12-12 06:59:26

标签: php mysql mysql-error-1044 password-hash

我正在尝试从位于slicehost服务器上的php脚本(两个不同的托管公司)连接到dreamhost的mysql服务器。 我需要这样做,所以我可以在slicehost将新数据传输到dreamhost。使用转储不是一种选择,因为表结构不同,我只需要传输一小部分数据(每日100-200条记录) 问题是我在slicehost使用新的MySQL密码哈希方法,而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搜索了
  • 已经与两位支持人员进行了交谈

对我来说更明显的选择是在dreamhost上开始使用新的MySQL密码哈希方法,但是它们不会改变它而且我不是root用户所以我自己也不能这样做。

任何疯狂的想法?

由VolkerK消化:

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; 但我需要SUPER特权这样做,他们不会把它给我

如果我运行查询

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'

我不是根...

梦想家支持的人坚持说问题就在我身边。但他说他会运行我告诉他的任何查询,因为它是私人服务器。 所以,我需要告诉这个人确切地说要运行什么。 所以,告诉他跑

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

会是一个好的开始吗?

6 个答案:

答案 0 :(得分:7)

在某些情况下,您仍然可以设置和使用“新的哈希算法密码” MySQL 4.1+服务器能够处理两种登录算法。使用哪一个独立于旧密码变量。如果MySQL找到以*开头的41个字符长的哈希值,则使用新系统。并且PASSWORD()函数也能够使用这两种算法。如果字段mysql.user.Password足够宽以存储41个字符而old-passwords变量为0则将创建“新”密码。 documention for old_passwordsVariable 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()返回“新”密码),您应该能够使用新算法set a new password在同一会话中为您的帐户。

但是如果dreamhost真的想要禁用新的密码算法,那么mysql.user.Password字段的长度将少于41个字符,可以做任何事情(除了唠叨它们)。< / p>

答案 1 :(得分:3)

我刚遇到这个问题,并且能够解决这个问题。

首先,使用不介意old_passwords的旧客户端连接到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);

这使我能够成功连接。

答案 2 :(得分:2)

是的,这看起来像个顽固分子。如果没有主机的合作或更改密码格式或客户端库的能力,您没有很多选择。

老实说,我的第一选择就是抛弃Dreamhost。这可能是很多工作,但是如果他们使用旧的不兼容的东西会被卡住,那将继续存在问题。

如果这不是一个选项,联合自动化流程怎么样?您可以将Slicehost端的数据导出为CSV文件,并按照Dreamhost所需的任何格式对其进行按摩,然后将其上传到Dreamhost服务器。您可以在Dreamhost服务器上安装一个cron脚本,定期检查上传的文件并对其进行处理(确保在成功处理后移动或删除它)。

答案 3 :(得分:2)

我会通过使用SELECT ... INTO OUTFILE将数据转储到Slicehost来解决这个问题。

这允许您设计查询以确保输出的格式与目标站点的表结构匹配。

然后将转储文件传输到Dreamhost并使用LOAD DATA INFILE

顺便说一句,Dreamhost真的仍在使用MySQL 4.0?它们非常过时 - 即使MySQL 4.1的扩展支持是expiring this month(2009年12月)。

答案 4 :(得分:1)

我认为您应该从slicehost创建WebServices / RPC并在其上编写相应的服务来处理它。

答案 5 :(得分:0)

我有同样的问题。为了解决这个问题,我做了以下几点:

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