MySQL 提供兩個驗證外掛程式,可針對使用者帳戶密碼實作 SHA-256 雜湊
caching_sha2_password
:實作 SHA-256 驗證(如同sha256_password
),但在伺服器端使用快取以獲得更佳效能,並具有更廣泛應用性的其他功能。sha256_password
:實作基本 SHA-256 驗證。此為已棄用且可能會移除的功能,請勿使用此驗證外掛程式。
本節說明快取 SHA-2 驗證外掛程式。關於原始基本(非快取)已棄用外掛程式的資訊,請參閱第 8.4.1.2 節,「SHA-256 可插拔驗證」。
在 MySQL 9.0 中,caching_sha2_password
是預設的驗證外掛程式;mysql_native_password
已不再可用。關於此變更對伺服器運作以及伺服器與用戶端和連接器相容性的影響資訊,請參閱以 caching_sha2_password 作為偏好的驗證外掛程式。
若要使用以 caching_sha2_password
外掛程式進行驗證的帳戶連線至伺服器,您必須使用安全連線,或使用支援透過 RSA 金鑰配對交換密碼的未加密連線,如本節稍後所述。無論哪種方式,caching_sha2_password
外掛程式都會使用 MySQL 的加密功能。請參閱第 8.3 節,「使用加密連線」。
在名稱 sha256_password
中,「sha256」指的是外掛程式用於加密的 256 位元摘要長度。在名稱 caching_sha2_password
中,「sha2」更廣泛地指的是 SHA-2 加密演算法類別,其中 256 位元加密是其中一個實例。後者的名稱選擇為未來擴展可能的摘要長度保留空間,而無需更改外掛程式名稱。
與 sha256_password
相比,caching_sha2_password
外掛程式具有以下優點:
在伺服器端,記憶體內快取可讓先前連線過的使用者在再次連線時更快地重新驗證。
無論 MySQL 連結的 SSL 函式庫為何,都可使用以 RSA 為基礎的密碼交換。
支援使用 Unix socket 檔案和共用記憶體協定的用戶端連線。
下表顯示伺服器端和用戶端的外掛程式名稱。
表 8.15 SHA-2 驗證的外掛程式和函式庫名稱
外掛程式或檔案 | 外掛程式或檔案名稱 |
---|---|
伺服器端外掛程式 | caching_sha2_password |
用戶端外掛程式 | caching_sha2_password |
函式庫檔案 | 無(外掛程式內建) |
以下章節提供有關快取 SHA-2 可插入式驗證的安裝和使用資訊。
如需 MySQL 中可插入式驗證的一般資訊,請參閱第 8.2.17 節,「可插入式驗證」。
caching_sha2_password
外掛程式以伺服器和用戶端兩種形式存在。
伺服器端外掛程式內建於伺服器中,不需要明確載入,且無法透過卸載停用。
用戶端外掛程式內建於
libmysqlclient
用戶端函式庫中,並且可供任何連結至libmysqlclient
的程式使用。
伺服器端外掛程式使用 sha2_cache_cleaner
稽核外掛程式作為輔助工具來執行密碼快取管理。sha2_cache_cleaner
與 caching_sha2_password
一樣,都是內建的,不需要安裝。
若要設定使用 caching_sha2_password
外掛程式進行 SHA-256 密碼雜湊處理的帳戶,請使用以下陳述式,其中 password
是所需的帳戶密碼。
CREATE USER 'sha2user'@'localhost'
IDENTIFIED WITH caching_sha2_password BY 'password';
伺服器會將 caching_sha2_password
外掛程式指派給帳戶,並使用它透過 SHA-256 加密密碼,然後將這些值儲存在 mysql.user
系統資料表的 plugin
和 authentication_string
欄中。
上述指示並未假設 caching_sha2_password
是預設的驗證外掛程式。如果 caching_sha2_password
是預設的驗證外掛程式,則可以使用更簡單的 CREATE USER
語法。
CREATE USER 'sha2user'@'localhost' IDENTIFIED BY 'password';
預設外掛程式由 authentication_policy
系統變數的值決定;預設值是使用 caching_sha2_password
。
若要使用不同的外掛程式,您必須使用 IDENTIFIED WITH
指定。例如,若要指定已棄用的 sha256_password
外掛程式,請使用此陳述式。
CREATE USER 'nativeuser'@'localhost'
IDENTIFIED WITH sha256_password BY 'password';
caching_sha2_password
支援透過安全傳輸的連線。如果您遵循本節稍後提供的 RSA 組態程序,它也支援透過未加密連線使用 RSA 加密密碼交換。RSA 支援具有以下特性:
在伺服器端,有兩個系統變數命名 RSA 私密和公開金鑰配對檔案:
caching_sha2_password_private_key_path
和caching_sha2_password_public_key_path
。如果使用的金鑰檔案名稱與系統變數預設值不同,資料庫管理員必須在伺服器啟動時設定這些變數。伺服器使用
caching_sha2_password_auto_generate_rsa_keys
系統變數來判斷是否自動產生 RSA 金鑰配對檔案。請參閱第 8.3.3 節,「建立 SSL 和 RSA 憑證和金鑰」。Caching_sha2_password_rsa_public_key
狀態變數會顯示caching_sha2_password
驗證外掛程式使用的 RSA 公開金鑰值。擁有 RSA 公開金鑰的用戶端可以在連線程序期間與伺服器執行以 RSA 金鑰配對為基礎的密碼交換,如下所述。
對於使用
caching_sha2_password
和以 RSA 金鑰配對為基礎的密碼交換進行驗證的帳戶的連線,伺服器預設不會將 RSA 公開金鑰傳送給用戶端。用戶端可以使用所需公開金鑰的用戶端副本,或向伺服器請求公開金鑰。使用受信任的公開金鑰本機副本可讓用戶端避免用戶端/伺服器協定中的往返行程,並且比從伺服器請求公開金鑰更安全。另一方面,從伺服器請求公開金鑰更方便(不需要管理用戶端檔案),並且在安全的網路環境中可能是可接受的。
對於命令列用戶端,請使用
--server-public-key-path
選項來指定 RSA 公開金鑰檔案。使用--get-server-public-key
選項從伺服器請求公開金鑰。以下程式支援這兩個選項:mysql、mysqlsh、mysqladmin、mysqlbinlog、mysqlcheck、mysqldump、mysqlimport、mysqlshow、mysqlslap、mysqltest。對於使用 C API 的程式,請呼叫
mysql_options()
,透過傳遞MYSQL_SERVER_PUBLIC_KEY
選項和檔案名稱來指定 RSA 公開金鑰檔案,或透過傳遞MYSQL_OPT_GET_SERVER_PUBLIC_KEY
選項從伺服器請求公開金鑰。對於複本,請使用
CHANGE REPLICATION SOURCE TO
陳述式和SOURCE_PUBLIC_KEY_PATH
選項來指定 RSA 公開金鑰檔案,或使用GET_SOURCE_PUBLIC_KEY
選項從來源請求公開金鑰。對於群組複寫,group_replication_recovery_public_key_path
和group_replication_recovery_get_public_key
系統變數具有相同的功能。
在所有情況下,如果提供了指定有效公開金鑰檔案的選項,則該選項的優先順序高於從伺服器請求公開金鑰的選項。
對於使用 caching_sha2_password
外掛程式的用戶端,密碼在連線至伺服器時永遠不會以明文形式公開。密碼傳輸的方式取決於是否使用安全連線或 RSA 加密。
如果連線是安全的,則不需要 RSA 金鑰配對,也不會使用。這適用於使用 TLS 加密的 TCP 連線,以及 Unix socket 檔案和共用記憶體連線。密碼會以明文形式傳送,但由於連線是安全的,因此無法被窺探。
如果連線不安全,則會使用 RSA 金鑰配對。這適用於未使用 TLS 加密的 TCP 連線和具名管道連線。RSA 僅用於用戶端和伺服器之間的密碼交換,以防止密碼被窺探。當伺服器收到加密的密碼時,它會將其解密。加密中使用擾亂來防止重複攻擊。
若要在用戶端連線程序期間啟用 RSA 金鑰配對用於密碼交換,請使用以下程序:
使用第 8.3.3 節,「建立 SSL 和 RSA 憑證和金鑰」中的說明建立 RSA 私密和公開金鑰配對檔案。
如果私密和公開金鑰檔案位於資料目錄中,且名稱為
private_key.pem
和public_key.pem
(caching_sha2_password_private_key_path
和caching_sha2_password_public_key_path
系統變數的預設值),則伺服器會在啟動時自動使用它們。否則,若要明確命名金鑰檔案,請在伺服器選項檔案中將系統變數設定為金鑰檔案名稱。如果檔案位於伺服器資料目錄中,則不需要指定其完整路徑名稱。
[mysqld] caching_sha2_password_private_key_path=myprivkey.pem caching_sha2_password_public_key_path=mypubkey.pem
如果金鑰檔案未位於資料目錄中,或要在系統變數值中明確指出其位置,請使用完整路徑名稱。
[mysqld] caching_sha2_password_private_key_path=/usr/local/mysql/myprivkey.pem caching_sha2_password_public_key_path=/usr/local/mysql/mypubkey.pem
如果您想要變更密碼產生期間
caching_sha2_password
所使用的雜湊回合數,請設定caching_sha2_password_digest_rounds
系統變數。例如:[mysqld] caching_sha2_password_digest_rounds=10000
重新啟動伺服器,然後連線到伺服器並檢查
Caching_sha2_password_rsa_public_key
狀態變數的值。實際顯示的值會與此處顯示的不同,但應該是非空的。mysql> SHOW STATUS LIKE 'Caching_sha2_password_rsa_public_key'\G *************************** 1. row *************************** Variable_name: Caching_sha2_password_rsa_public_key Value: -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDO9nRUDd+KvSZgY7cNBZMNpwX6 MvE1PbJFXO7u18nJ9lwc99Du/E7lw6CVXw7VKrXPeHbVQUzGyUNkf45Nz/ckaaJa aLgJOBCIDmNVnyU54OT/1lcs2xiyfaDMe8fCJ64ZwTnKbY2gkt1IMjUAB5Ogd5kJ g8aV7EtKwyhHb0c30QIDAQAB -----END PUBLIC KEY-----
如果值為空,則表示伺服器在金鑰檔案方面發現了一些問題。請檢查錯誤日誌以獲取診斷資訊。
在伺服器配置了 RSA 金鑰檔案後,使用 caching_sha2_password
外掛程式進行驗證的帳戶,可以選擇使用這些金鑰檔案來連線到伺服器。如前所述,此類帳戶可以使用安全連線(在這種情況下不會使用 RSA)或使用 RSA 執行密碼交換的未加密連線。假設使用未加密的連線。例如:
$> mysql --ssl-mode=DISABLED -u sha2user -p
Enter password: password
對於 sha2user
的此連線嘗試,伺服器會判斷 caching_sha2_password
是適當的驗證外掛程式並呼叫它(因為這是在 CREATE USER
時指定的外掛程式)。外掛程式發現連線未加密,因此需要使用 RSA 加密傳輸密碼。但是,伺服器不會將公鑰傳送給用戶端,且用戶端未提供公鑰,因此它無法加密密碼,連線失敗。
ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password'
reported error: Authentication requires secure connection.
若要從伺服器請求 RSA 公鑰,請指定 --get-server-public-key
選項。
$> mysql --ssl-mode=DISABLED -u sha2user -p --get-server-public-key
Enter password: password
在此情況下,伺服器會將 RSA 公鑰傳送給用戶端,用戶端會使用它來加密密碼,並將結果傳回伺服器。外掛程式會使用伺服器端的 RSA 私鑰來解密密碼,並根據密碼是否正確來接受或拒絕連線。
或者,如果用戶端有一個包含伺服器所需 RSA 公鑰的本機副本的檔案,則可以使用 --server-public-key-path
選項來指定該檔案。
$> mysql --ssl-mode=DISABLED -u sha2user -p --server-public-key-path=file_name
Enter password: password
在此情況下,用戶端會使用公鑰來加密密碼,並將結果傳回伺服器。外掛程式會使用伺服器端的 RSA 私鑰來解密密碼,並根據密碼是否正確來接受或拒絕連線。
由 --server-public-key-path
選項命名的檔案中的公鑰值應與由 caching_sha2_password_public_key_path
系統變數命名的伺服器端檔案中的金鑰值相同。如果金鑰檔案包含有效的公鑰值,但該值不正確,則會發生拒絕存取錯誤。如果金鑰檔案不包含有效的公鑰,則用戶端程式無法使用它。
用戶端使用者可以透過兩種方式取得 RSA 公鑰:
資料庫管理員可以提供公鑰檔案的副本。
可以透過其他方式連線到伺服器的用戶端使用者可以使用
SHOW STATUS LIKE 'Caching_sha2_password_rsa_public_key'
陳述式,並將傳回的金鑰值儲存到檔案中。
在伺服器端,caching_sha2_password
外掛程式使用記憶體內快取,以便更快地驗證先前連線過的用戶端。項目由帳戶名稱/密碼雜湊對組成。快取運作方式如下:
當用戶端連線時,
caching_sha2_password
會檢查用戶端和密碼是否符合某些快取項目。如果是,則驗證成功。如果沒有相符的快取項目,外掛程式會嘗試根據
mysql.user
系統表格中的憑證來驗證用戶端。如果驗證成功,caching_sha2_password
會將用戶端的項目新增至雜湊。否則,驗證失敗,連線會遭到拒絕。
這樣一來,當用戶端第一次連線時,會根據 mysql.user
系統表格進行驗證。當用戶端後續連線時,會針對快取進行更快的驗證。
除了新增項目之外的密碼快取操作,是由 sha2_cache_cleaner
稽核外掛程式處理的,該外掛程式會代表 caching_sha2_password
執行這些動作。
它會清除任何重新命名或刪除的帳戶的快取項目,或任何變更憑證或驗證外掛程式的帳戶的快取項目。
當執行
FLUSH PRIVILEGES
陳述式時,它會清空快取。它會在伺服器關機時清空快取。(這表示快取不會在伺服器重新啟動時持續存在。)
快取清除作業會影響後續用戶端連線的驗證要求。對於每個使用者帳戶,在執行下列任何操作之後,該用戶的第一次用戶端連線必須使用安全連線(使用 TLS 憑證透過 TCP 建立、Unix Socket 檔案或共用記憶體)或基於 RSA 金鑰對的密碼交換。
在帳戶建立之後。
在變更帳戶密碼之後。
在帳戶執行
RENAME USER
之後。在執行
FLUSH PRIVILEGES
之後。
FLUSH PRIVILEGES
會清除整個快取,並影響所有使用 caching_sha2_password
外掛程式的帳戶。其他操作會清除特定的快取項目,並且只會影響屬於該操作一部分的帳戶。
一旦使用者成功驗證,帳戶就會輸入快取中,後續連線不需要安全連線或 RSA 金鑰對,直到發生另一個影響該帳戶的快取清除事件為止。(當可以使用快取時,伺服器會使用不需要明文密碼傳輸且不需要安全連線的挑戰回應機制。)