Mysql密码哈希方法旧vs新

The*_*tor 8 php mysql password-hash mysql-error-1044

我正在尝试从位于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) 
Run Code Online (Sandbox Code Playgroud)

事实:

  • 我需要在slicehost继续使用新方法,我不能使用较旧的php版本/库
  • 数据库太大,无法每天使用转储进行传输
  • 即使我这样做,表格也有不同的结构
  • 我需要每天只复制它的一小部分(只有当天的变化,100-200条记录)
  • 由于表格如此不同,我需要使用php作为规范化数据的桥梁
  • 已经谷歌搜索了它
  • 已经与两位支持人员进行了交谈

对我来说更明显的选择是在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)
Run Code Online (Sandbox Code Playgroud)

现在显而易见的是运行mysql> SET GLOBAL old_passwords = 0; 但我需要SUPER特权这样做,他们不会给我

如果我运行查询

SET PASSWORD FOR 'nodari'@'HOSTNAME' = PASSWORD('new password');
Run Code Online (Sandbox Code Playgroud)

我收到了错误

ERROR 1044 (42000): Access denied for user 'nodari'@'67.205.0.0/255.255.192.0' to database 'mysql'
Run Code Online (Sandbox Code Playgroud)

我不是根...

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';
Run Code Online (Sandbox Code Playgroud)

会是一个好的开始吗?

Vol*_*erK 7

在某些情况下,您仍然可以设置和使用"新的哈希算法密码".
MySQL 4.1+服务器能够处理两种登录算法.使用哪一个独立于旧密码变量.如果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'));
Run Code Online (Sandbox Code Playgroud)

如果打印1, 0, 41(意味着全局old_passwords已打开,但对于会话已关闭且PASSWORD()返回"新"密码),您应该能够在同一会话中使用新算法为您的帐户设置新密码.

但是如果dreamhost真的想要禁用新密码算法,那么mysql.user.Password字段的长度将少于41个字符,无能为力(除了唠叨它们).


zom*_*bat 2

是的,这看起来像个硬汉。如果没有主机的合作或无法更改密码格式或客户端库,您就没有很多选择。

老实说,我的第一选择是放弃 Dreamhost。这可能需要大量工作,但如果他们要继续使用旧的不兼容的东西,那么问题仍然会存在。

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