Laravel6.0 with Mysql8 problem for That the server requested authentication method unknown to the client
SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client
如果 laradock 中設定的是 mysql:latest,在 2018 年時就已經會安裝到 mysql8 了,這時會發現無法正確使用 laravel 預設 Mysql 連線方式與資料庫連線,出現如標題的錯誤訊息,原因是 Mysql8 預設的 hash 方式已經從5.7版的 mysql_native_password 轉為 caching_sha2_password。
網路搜尋到的結論
- laravel 與 Mysql 連線是使用 PDO_MYSQL 尚無法支援 caching_sha2_password,官方說明點這。
- 解決方法 1:降 MySQL 版本成 5.6
- 解決方法 2:將 MySQL8 預設使用加密 hash 設回 5.6 版本(推薦,因可以享有 MySQL8 帶來的效能提升)
解法參考
如果是使用 Laradock 的用戶可以參考以下
可以調整 docker-compose.yml 中 mysql 啟動的指令,新增 command 這一行,去將預設的 authentication 改回 5.6 的版本預設。
為什麼MySQL8 要將 hash 方法更新,參考Mysql官方說明
- 安全性:NIST 在2015時建議應該停止使用 sha1 的 hash算法
- 效率:以 cache 機制優化驗證速度
補充:MySQL 5.6版本的 mysql_native_password 依賴 sha1,並且是無加 salt 的模式。
結論
遇雷後,雖然很氣在版本升級時竟然不兼容舊版的程式,希望 PDO_MYSQL 可以趕快跟上 MySQL 這個更新正式讓安全升級實現在各大服務上,而 hash 演算法應該會依循電腦運算速度持續演進的,或許之後發生升級時有沒有一個更無痛的升級方法呢,如果內容有誤歡迎糾正及討論。
如果喜歡我這篇文,可以幫我拍手 1-10 下
如果覺得這文章對你有幫助,可以幫我拍手 10–30 下
如果覺得想看到更多關於學習筆記的文章,可以幫我拍手 30–50 下
讓我知道也記得 Follow我 陳建宇
更歡迎你在下方留言,我很樂意與你討論聊天或回答問題!
參考資料: