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

MySQL客戶端不支援鑑定協議解決方案:舊版客戶端連線新版伺服器完整指南

     編輯:MySQL 資料庫相關知識

問題根源:密碼雜湊演算法升級

MySQL 4.1引入新式密碼雜湊演算法(41位元組),不相容於4.1之前版本使用的舊式雜湊(16位元組)。當舊版客戶端(含舊版PHP mysql擴展)連線新版伺服器(4.1+)時,會報錯:

Client does not support authentication protocol requested by server; 
consider upgrading MySQL client.

四大解決方案對比

方案一:升級客戶端程式庫(最佳長期方案)⭐

  • 更新所有客戶端至4.1.1+版本(含libmysqlclient)
  • PHP環境:升級至PHP 5+並使用mysqli或PDO_MySQL擴展(原生支援新協議)
  • 優點:徹底解決相容性、獲得安全性增強、效能提升

方案二:為舊版客戶端保留舊式密碼帳號

  • 建立專用帳號給舊版客戶端使用,設定舊式密碼雜湊
  • 新版客戶端繼續使用新式密碼帳號
  • 缺點:帳號管理複雜、降低整體安全等級

方案三:將特定帳號密碼轉為舊式雜湊(常用過渡方案)

-- 方法一:SET PASSWORD(推薦)
SET PASSWORD FOR 'legacy_user'@'%' = OLD_PASSWORD('newpass');

-- 方法二:UPDATE + FLUSH PRIVILEGES
UPDATE mysql.user SET Password = OLD_PASSWORD('newpass') 
WHERE User = 'legacy_user' AND Host = '%';
FLUSH PRIVILEGES;

注意:MySQL無法反推原始密碼,必須重新設定新密碼。

方案四:伺服器全域啟用舊式密碼雜湊(不推薦長期使用)

[mysqld]
old_passwords=1

啟用後,PASSWORD()函數產生舊式雜湊。需將現有長密碼帳號轉換:

-- 找出使用新式雜湊的帳號(密碼長度>16)
SELECT Host, User, Password FROM mysql.user WHERE LENGTH(Password) > 16;

-- 逐一轉換為舊式雜湊
SET PASSWORD FOR 'user'@'host' = OLD_PASSWORD('newpass');

PHP環境特殊說明

PHP擴展MySQL 4.1+支援備註
mysql(舊版)❌ 不支援新協議需配合方案三或四
mysqli(PHP 5+)✅ 完整支援推薦使用,功能更豐富
PDO_MySQL✅ 完整支援資料庫抽象層首選

最佳實踐建議

  1. 新專案:強制使用mysqli或PDO,拒絕舊版mysql擴展
  2. 舊專案遷移:短期採用方案三(特定帳號舊式密碼),規劃時間表全面升級客戶端
  3. 安全基線:禁止在生產環境長期啟用old_passwords=1,新式雜湊(SHA-1基礎)安全性顯著優於舊式
  4. 密碼策略:配合validate_password外掛強制密碼複雜度、定期輪換
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved