首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 5.x 密碼插件兼容性問題:新舊認證協議衝突與解決方案

     編輯:MySQL 資料庫相關知識

MySQL 4.1.1 引入 41 位雜湊密碼(mysql_native_password),導致舊客戶端(libmysql 3.23/4.0/4.1 早期版本)無法連接,報錯 Client does not support authentication protocol requested by server。本文詳解原理與三種解決路徑。

一、問題根因

  • MySQL 4.1 前:16 位雜湊(OLD_PASSWORD() 算法)
  • MySQL 4.1+:41 位雜湊(PASSWORD() = mysql_native_password)
  • 舊客戶端不識別新插件協議,握手階段失敗
mysql> SELECT PASSWORD('test');
+-------------------------------------------+
| PASSWORD('test')                          |
+-------------------------------------------+
| *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 |  -- 41 位,* 開頭
+-------------------------------------------+

mysql> SELECT OLD_PASSWORD('test');
+--------------------+
| OLD_PASSWORD('test') |
+--------------------+
| 162eebfb6477e5d3   |  -- 16 位
+--------------------+

二、三種解決方案

方案一:升級客戶端驅動(推薦、徹底)

  • PHP:替換 libmysql.dll 為 MySQL 5.1+ 版本,或改用 mysqlnd(PHP 5.3+ 內建,無依賴)
  • Java:升級 Connector/J 至 5.1.7+
  • Python:使用 PyMySQL / mysqlclient(基於新協議)
  • .NET:升級 MySQL Connector/NET 6.0+

方案二:服務端強制使用舊密碼協議(過渡、有風險)

[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)。

三、驗證與遷移檢查清單

  1. SELECT User, Host, plugin, LENGTH(authentication_string) FROM mysql.user; 確認插件與雜湊長度
  2. 所有應用連接測試通過
  3. 若使用方案二/三:制定遷移計劃,逐個應用升級驅動後,執行 ALTER USER ... IDENTIFIED WITH caching_sha2_password BY 'newstrongpass'; 遷回強認證
  4. 運行 mysql_secure_installation 清理匿名用戶、測試庫、遠程 root

四、MySQL 8.0 額外注意

  • 默認插件 caching_sha2_password 要求客戶端支持 RSA 公鑰交換或 SSL
  • 舊驅動無法連接 8.0 時,必須為該用戶指定 mysql_native_password:
    ALTER USER 'old'@'%' IDENTIFIED WITH mysql_native_password BY 'pass';
  • old_passwords 系統變量在 8.0 已移除,無法再生成 16 位雜湊

認證協議升級是安全演進的必然。以「升級客戶端驅動」為主線、「按用戶指定插件」為過渡,避免全局降級帶來的安全債務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved