MySQL 4.1.1 引入 41 位雜湊密碼(mysql_native_password),導致舊客戶端(libmysql 3.23/4.0/4.1 早期版本)無法連接,報錯 Client does not support authentication protocol requested by server。本文詳解原理與三種解決路徑。
OLD_PASSWORD() 算法)PASSWORD() = mysql_native_password)mysql> SELECT PASSWORD('test');
+-------------------------------------------+
| PASSWORD('test') |
+-------------------------------------------+
| *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 | -- 41 位,* 開頭
+-------------------------------------------+
mysql> SELECT OLD_PASSWORD('test');
+--------------------+
| OLD_PASSWORD('test') |
+--------------------+
| 162eebfb6477e5d3 | -- 16 位
+--------------------+
libmysql.dll 為 MySQL 5.1+ 版本,或改用 mysqlnd(PHP 5.3+ 內建,無依賴)PyMySQL / mysqlclient(基於新協議)[mysqld]
default-authentication-plugin=mysql_native_password # 8.0 默認 caching_sha2_password
old_passwords=1 # 5.6/5.7 可用,8.0 已移除
# 重啟後,新建用戶密碼自動生成 16 位雜湊
CREATE USER 'legacy'@'%' IDENTIFIED BY 'pass'; -- 產生 16 位
-- 或修改現有用戶
SET old_passwords=1;
ALTER USER 'app'@'%' IDENTIFIED BY 'newpass';
⚠️ 風險: 16 位雜湊安全性極低(無鹽、可彩虹表破解),**僅作臨時過渡**,完成客戶端升級後必須遷回新協議。
-- 現有用戶改用舊插件(兼容舊驅動)
ALTER USER 'legacy_app'@'%' IDENTIFIED WITH mysql_native_password BY 'pass'; -- 5.7/8.0 語法
-- 或 5.6
SET old_passwords=1;
UPDATE mysql.user SET Password=PASSWORD('pass'), plugin='mysql_old_password' WHERE User='legacy_app';
FLUSH PRIVILEGES;
新建用戶默認使用 default-authentication-plugin 指定的插件(5.7 默認 mysql_native_password,8.0 默認 caching_sha2_password)。
SELECT User, Host, plugin, LENGTH(authentication_string) FROM mysql.user; 確認插件與雜湊長度ALTER USER ... IDENTIFIED WITH caching_sha2_password BY 'newstrongpass'; 遷回強認證mysql_secure_installation 清理匿名用戶、測試庫、遠程 rootcaching_sha2_password 要求客戶端支持 RSA 公鑰交換或 SSLmysql_native_password:ALTER USER 'old'@'%' IDENTIFIED WITH mysql_native_password BY 'pass';old_passwords 系統變量在 8.0 已移除,無法再生成 16 位雜湊認證協議升級是安全演進的必然。以「升級客戶端驅動」為主線、「按用戶指定插件」為過渡,避免全局降級帶來的安全債務。