淺談 MySQL 新的身份驗證插件 caching_sha2_password

来源:https://www.cnblogs.com/greatsql/archive/2022/11/02/16850316.html
-Advertisement-
Play Games

GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 介紹 從 MySQL 8.0.4 開始,MySQL 預設身份驗證插件從 mysql_native_password 改為 caching_sha2_pa ...


  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。
  • GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。

介紹

從 MySQL 8.0.4 開始,MySQL 預設身份驗證插件從 mysql_native_password 改為 caching_sha2_password 。相應地,libmysqlclient 也使用 caching_sha2_password 作為預設的身份驗證機制。

起因

在這之前 MySQL 5.6/5.7 使用的預設密碼插件是 mysql_native_passwordmysql_native_password 的特點是不需要加密的連接。該插件驗證速度特別快,但是不夠安全,因為,mysql_native_password 使用的是於 SHA1 演算法,NIST(美國國家標準與技術研究院)在很早之前就已建議停止使用 SHA1 演算法,因為 SHA1 和其他哈希演算法(例如 MD5)容易被破解。

其實從 MySQL 5.6 開始就引入了更安全的認證機制:ha256_password 認證插件。它使用一個加鹽密碼(salted password)進行多輪 SHA256 哈希(數千輪哈希,暴力破解更難),以確保哈希值轉換更安全。但是,建立安全連接和多輪 hash 加密很耗費時間。雖然安全性更高,但是驗證速度不夠快。

改進

MySQL 試圖結合倆者的優點。於是在 MySQL-8.0.3 引入了一個新的身份驗證插件 caching_sha2_password ,作為sha256_password的代替方案,在sha256_password 的基礎上進行了改進補上了短板,既解決安全性問題又解決性能問題。與此同時 sha256_password將退出時代的浪潮。MySQL 預計在未來版本中將其刪除。使用 sha256_password 進行身份驗證的 MySQL 帳戶建議轉為 caching_sha2_password

結果

因為預設身份驗證機制的更改,大家在使用 MySQL 8.0 時候出現了很多相關的問題。網上的大部分教程都是教人改回mysql_native_password驗證方式 mysql_native_password。但是筆者認為,MySQL 更改預設插件是為了更好的安全性考慮。如果有 MySQL 服務要公網上使用,建議還是儘量使用 caching_sha2_password作為認證插件。

示例:使用舊版本客戶端連接時報錯:

shell> mysql -uroot -p
ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded

具體機制分析

mysql_native_password

mysql_native_password 作為 MySQL 5.6/5.7 的預設密碼插件 。其優點是它支持 challenge-response (挑戰應答方式),這是非常快的驗證機制,無需在網路中發送實際密碼,並且不需要加密的連接。

客戶端連接MySQL實例時,首先需要從伺服器端獲得一個20位元組的隨機數。

此外,mysql_native_password 使用了新的哈希演算法進行認證校驗。對於用戶的原始密碼,通過SHA1(SHA1(password))兩次哈希計算結果保存在 mysql.user 表的 authentication_string 列中。其中用戶密碼通過哈希計算後保存,沒有加鹽(salt)。

通過上述這樣的處理,MySQL資料庫本身已然非常安全。然而,隨著時間的推移,目前存在以下兩種潛在風險:

  • SHA1哈希演算法也已經變得比較容易破解。
  • 相同的密碼擁有相同的哈希值。

SHA1、MD5等之前的哈希演算法都已然不再安全,更為安全的SHA256、SHA512哈希演算法也已推出。作為數據存儲最終承載者,應該使用更新的加密機制機制。

caching_sha2_password

在cache_sha2_password密碼認證機制下,其改進如下所示:

  • 保存在 authentication_string 中的哈希值為加鹽後的值,即使兩個不同用戶的密碼相同,保存在電腦中的哈希值也不同。
  • 哈希演算法升級為了更為安全SHA256演算法。
  • 哈希演算法的 round 次數從原來的兩次,提升為了5000次,round次數越多,每次計算哈希值的代價越大,破解難度也就越大。
  • 用TLS的加密或RSA密鑰傳輸方式從客戶端將密碼傳送到服務端。

通訊過程解析

  1. 對於大多數連接嘗試,當密碼的哈希值有緩存在記憶體中時,它的驗證是基於 SHA256 的challenge-response機制(與 mysql_native_password 中基於 SHA1 的challenge-response機制相比更快),下圖演示了在有哈希緩存時的驗證流程。

file

  1. 客戶端連接服務端
  2. 服務端給客戶端發送 Nonce(20 位元組長的隨機數據)
  3. 客戶端使用 XOR(SHA256(password), SHA256(SHA256(SHA256(password)), nonce)) 生成 Scramble 發送給服務端
  4. 服務端檢查 username/SHA256(SHA256(user_password)) 是否在記憶體緩存條目中存在,存在則證明合法;發送 fast_auth_success 包到客戶端
  5. 服務端發送 OK 包到客戶端
  6. 進入命令階段

Nonce 是一個在加密通信只能使用一次的數字。在認證協議中,它往往是一個隨機或偽隨機數(salt),以避免暴力攻擊。

  1. 當沒有這種緩存時,caching_sha2_password 需要使用安全連接進行密碼交換。考慮到用戶更改和 FLUSH PRIVILEGES 操作頻率比較低,所以在大多數情況下,使用的都是基於challenge-response的身份驗證,不用建立安全連接。這省去了建立安全連接需要耗費的資源。下圖總結了完整的驗證流程。

file

  1. 客戶端連接服務端
  2. 服務端給客戶端發送 Nonce(20 位元組長的隨機數據)
  3. 客戶端使用 XOR(SHA256(password), SHA256(SHA256(SHA256(password)), nonce)) 生成 Scramble 發送給服務端
  4. 服務端檢查 username/SHA256(SHA256(user_password)) 是否在記憶體緩存條目中存在,不存在則發送 perform_full_authentication 包到客戶端繼續認證
  5. 客戶端收到 perform_full_authentication 包,可以進行如下處理
  6. 如果安全連接已經建立基於 ,則可以直接發送明文密碼到服務端
    向服務端發起獲取公鑰的請求(或者指定服務端公鑰文件),使用公鑰+Nonce加密密碼,發送加密後的密碼到服務端
    伺服器通過 SHA256 演算法計算得到哈希值,判斷是否用戶認證通過,通過則發送 OK 包到客戶端
  7. 進入命令階段

這裡詳細解釋一下 RSA 非對稱加密的通信過程:

首先先明確一個概念:非對稱加密演算法中,有兩個密鑰:公鑰和私鑰。如果用公鑰進行加密,只有對應的私鑰才能解密;反之亦然。

RSA 密鑰交換過程:

伺服器生成一對密鑰並將公鑰向其他方公開(明文發送給客戶端);

客戶端使用伺服器的公鑰對密碼進行加密後發送給伺服器;

伺服器用對應的私鑰對加密信息進行解密。

因為客戶端用公鑰加密的信息只能用伺服器的私鑰解密,所以這個連接過程可以視為加密通信。

file

需要註意的地方

預設身份驗證插件的更改意味著:

在 MySQL 8.0.4 之後創建的所有新用戶將預設使用 caching_sha2_password 作為身份驗證插件。

mysql> SELECT USER,PLUGIN FROM mysql.`user` ;
+------------------+-----------------------+
| USER             | PLUGIN                |
+------------------+-----------------------+
| root             | caching_sha2_password |
| mysql.infoschema | caching_sha2_password |
| mysql.session    | caching_sha2_password |
| mysql.sys        | caching_sha2_password |
+------------------+-----------------------+
6 rows in set (0.06 sec)

libmysqlclient 預設使用 caching_sha2_password,可以通過手動修改切換到其他的身份驗證插件。

對於使用 caching_sha2_password 插件的客戶端,連接到伺服器時,密碼不會暴露為明文。密碼傳輸是如何進行的取決於是否使用安全連接或 RSA 對密碼加密:

  • 如果連接是安全的,可以不使用 RSA 密鑰。適用於使用 TLS 加密的 TCP 連接,以及 Unix 套接字文件和共用記憶體連接。密碼以明文格式發送,但不能被竊聽,因為連接是安全的。
  • 如果連接不是安全的,可以使用 RSA 密鑰對。適用於未使用 TLS 加密的 TCP 連接和 named-pipe 連接。RSA 僅用於客戶端和伺服器之間的密碼交換,防止密碼被截取。當伺服器接收到使用公鑰加密的密碼後,它使用私鑰解密。一個隨機字元串用在加密中,防止重放攻擊(repeat attacks)。

在 MySQL 8.0.3 以上版本中。預設自動完成 RSA 密鑰對進行密碼交換。

關於主從複製

複製本身是支持加密的連接。在 MySQL 8.0.4中,添加了複製對 RSA 加密的支持。

如果用於複製的用戶使用了 caching_sha2_password身份驗證插件,並且沒有啟用安全連接( 在group_replication_recovery 啟用SSL支持),MySQL 將使用 RSA 密鑰對進行密碼的交換,可以把主節點的公鑰手動拷貝到從節點的伺服器中,也可以設置成:自動為請求加入組的節點提供公鑰。

  • CHANGE MASTER 可以通過以下倆個參數來啟用基於 caching_sha2_password RSA 密鑰來交換密碼:

     指定 RSA 公鑰路徑
    - MASTER_PUBLIC_KEY_PATH ="key_file_path"  
     
     #從服務端獲取 RSA 公鑰
    - GET_MASTER_PUBLIC_KEY = {0 | 1}
    
  • Group Replication 可以通過以下倆個參數來啟用基於 caching_sha2_password RSA 密鑰來交換密碼:

    #指定 RSA 公鑰路徑
    ––group-replication-recovery-public-key-path
    #從服務端獲取 RSA 公鑰
    ––group-replication-recovery-get-public-key
    

資料庫升級

資料庫升級到 MySQL 8.0.4 會怎樣?

在升級之前創建的用戶,身份認證插件不會更改。在升級之後創建的用戶預設使用 aching_sha2_password身份驗證插件。除非使用 --default-authentication-plugin 手動指定認證插件插件。因為不會更改升級前已有用戶。因此,使用升級後依然可以用舊版本的客戶端連接這些用戶。

相應地,libmysqlclient 支持 mysql_options() C API函數的 MYSQL_DEFAULT_AUTH 選項。(對於 MySQL 包中可用的基於 libmysqlclient 的客戶端工具,可以用 ––default-auth 命令行選項達到相同的目的。)

建議使用 cache_sha2_password 因為它更安全。並且升級 libmysqlclient 到 MySQL 8.0.4 或更高版本,以便支持新的身份驗證插件。

參考資料

MySQL 8.0.4 : New Default Authentication Plugin : caching_sha2_password

得物技術淺談MySQL 8.0:新的身份驗證插件

MySQL 8.0密碼認證機制升級,不知道可能導致業務不可用!!!
組複製安裝部署 | 全方位認識 MySQL 8.0 Group Replication


Enjoy GreatSQL

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • lsof -i tcp:埠號 要殺死進程的話,即:kill -9 pid ...
  • 前言 上一篇博客給大家介紹了LabVIEW開放神經網路交互工具包【ONNX】,今天我們就一起來看一下如何使用LabVIEW開放神經網路交互工具包實現TensorRT加速YOLOv5。 以下是YOLOv5的相關筆記總結,希望對大家有所幫助。 內容地址鏈接 【YOLOv5】LabVIEW+OpenVIN ...
  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 前文回顧 實現一個簡單的Database1(譯文) 實現一個簡單的Database2(譯文) 實現一個簡單的Database3(譯文) 實現一個簡單的D ...
  • 前面說到了redis在單機的模式下是可以數據持久化的,但是不可以解決單點失敗的問題,當單台redis伺服器出現問題時,就可能會造成數據的丟失;想要解決這個問題的話我們可以使用Redis的主從模式這也是Redis集群最簡單的實現方式,這篇文章我就來簡單部署一個Redis主從架構,我準備了3台ubunt ...
  • 摘要:本文通過對ETCD服務異常問題分析,代碼展示解決方案。 本文分享自華為雲社區《【實例狀態】GaussDB ETCD服務異常》,作者:酷哥。 首先確認是否是虛擬機、網路故障 虛擬機故障導致ETCD服務異常告警 問題現象 管控面上報etcd服務異常告警,虛擬機發生重啟,熱遷移、冷遷移,HA等動作。 ...
  • 資料庫連接 鏈接資料庫:代表連接資料庫管理系 統 <!--一個應用程式可以對應一個資料庫,一個資料庫管理系統可以管理多個資料庫--> <!--表是用來存儲數據的--> -- 連接資料庫管理系統 mysql -u root -p -- -u 代表用戶 -p代表用密碼登錄 定義資料庫 -- 創建資料庫 ...
  • Redis雖然是一個記憶體級別的緩存程式,也就是redis是使用記憶體進行數據的緩存的,但是其可以將記憶體的數據按照一定的策略保存到硬碟中,這樣的話就可以實現持久保存的目的;目前的話redis支持的兩種不同方式的數據持久化保存機制,分別是RDB和AOF,這兩種方式的話很類似於MySQL資料庫的dump和二 ...
  • PostgreSQL 高可用資料庫的常見搭建方式主要有兩種,邏輯複製和物理複製,上周已經寫過了關於在Windows環境搭建PostgreSQL邏輯複製的教程,這周來記錄一下 物理複製的搭建方法。 首先介紹一下邏輯複製和物理複製的一些基本區別: 物理複製要求多個實例之間大版本一致,並且操作系統平臺一致 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...