MySQL 提供兩個驗證外掛程式,為使用者帳戶密碼實作 SHA-256 雜湊
sha256_password
:實作基本 SHA-256 驗證。caching_sha2_password
:實作 SHA-256 驗證(如sha256_password
),但在伺服器端使用快取以獲得更好的效能,並具有更廣泛適用性的其他功能。
本節描述原始的非快取 SHA-2 驗證外掛程式。如需快取外掛程式的資訊,請參閱第 8.4.1.1 節,「快取 SHA-2 可插拔式驗證」。
在 MySQL 9.0 中,caching_sha2_password
是預設驗證外掛程式;mysql_native_password
不再可用。如需此變更對伺服器運作以及伺服器與用戶端和連接器相容性的影響的資訊,請參閱以 caching_sha2_password 作為慣用驗證外掛程式。
由於 caching_sha2_password
是 MySQL 9.0 中的預設驗證外掛程式,並提供 sha256_password
驗證外掛程式功能的超集,因此 sha256_password
已被棄用;預計在未來版本的 MySQL 中將被移除。使用 sha256_password
驗證的 MySQL 帳戶應移轉為改用 caching_sha2_password
。
若要使用以 sha256_password
外掛程式驗證的帳戶連線至伺服器,您必須使用 TLS 連線或支援使用 RSA 金鑰配對交換密碼的未加密連線,如本節稍後所述。無論哪種方式,sha256_password
外掛程式都使用 MySQL 的加密功能。請參閱第 8.3 節,「使用加密連線」。
在名稱 sha256_password
中,「sha256」指的是外掛程式用於加密的 256 位元摘要長度。在名稱 caching_sha2_password
中,「sha2」更廣泛地指的是 SHA-2 加密演算法類別,其中 256 位元加密是其中一個實例。後者的名稱選擇為未來擴展可能的摘要長度留下了空間,而無需更改外掛程式的名稱。
下表顯示伺服器端和用戶端的外掛程式名稱。
表 8.16 SHA-256 驗證的外掛程式和程式庫名稱
外掛程式或檔案 | 外掛程式或檔案名稱 |
---|---|
伺服器端外掛程式 | sha256_password |
用戶端外掛程式 | sha256_password |
程式庫檔案 | 無 (外掛程式為內建) |
以下章節提供有關 SHA-256 可插拔驗證的安裝和使用資訊
有關 MySQL 中可插拔驗證的一般資訊,請參閱第 8.2.17 節,「可插拔驗證」。
sha256_password
外掛程式以伺服器和用戶端形式存在
伺服器端外掛程式內建於伺服器中,不需要明確載入,且無法透過卸載來停用。
用戶端外掛程式內建於
libmysqlclient
用戶端程式庫中,並且可供任何連結到libmysqlclient
的程式使用。
若要設定一個使用 sha256_password
外掛程式進行 SHA-256 密碼雜湊的帳戶,請使用以下陳述式,其中 password
是所需的帳戶密碼
CREATE USER 'sha256user'@'localhost'
IDENTIFIED WITH sha256_password BY 'password';
伺服器會將 sha256_password
外掛程式指派給該帳戶,並使用它以 SHA-256 加密密碼,將這些值儲存在 mysql.user
系統資料表的 plugin
和 authentication_string
資料行中。
(如果 sha256_password
是預設外掛程式,則不需要 IDENTIFIED WITH
子句;這可以使用 authentication_policy
來指定。)
sha256_password
支援透過安全傳輸的連線。sha256_password
也支援如果 MySQL 使用 OpenSSL 編譯,則透過未加密連線使用 RSA 加密的密碼交換,且您想要連線的 MySQL 伺服器已設定為支援 RSA(使用本節稍後提供的 RSA 設定程序)。
RSA 支援具有以下特性
在伺服器端,兩個系統變數會命名 RSA 私鑰和公鑰對檔案:
sha256_password_private_key_path
和sha256_password_public_key_path
。如果使用的金鑰檔案名稱與系統變數預設值不同,則資料庫管理員必須在伺服器啟動時設定這些變數。伺服器使用
sha256_password_auto_generate_rsa_keys
系統變數來判斷是否自動產生 RSA 金鑰對檔案。請參閱第 8.3.3 節,「建立 SSL 和 RSA 憑證和金鑰」。Rsa_public_key
狀態變數會顯示sha256_password
驗證外掛程式使用的 RSA 公鑰值。擁有 RSA 公鑰的用戶端可以在連線過程中與伺服器執行基於 RSA 金鑰對的密碼交換,如下所述。
對於使用
sha256_password
和基於 RSA 公鑰對的密碼交換進行驗證的帳戶的連線,伺服器會根據需要將 RSA 公鑰傳送給用戶端。但是,如果用戶端主機上提供了公鑰副本,則用戶端可以使用它來在用戶端/伺服器協定中節省一次往返。對於這些命令列用戶端,請使用
--server-public-key-path
選項來指定 RSA 公鑰檔案:mysql、mysqladmin、mysqlbinlog、mysqlcheck、mysqldump、mysqlimport、mysqlshow、mysqlslap、mysqltest。對於使用 C API 的程式,請呼叫
mysql_options()
,方法是傳遞MYSQL_SERVER_PUBLIC_KEY
選項和檔案名稱,以指定 RSA 公鑰檔案。對於複本,請使用具有
SOURCE_PUBLIC_KEY_PATH
選項的CHANGE REPLICATION SOURCE TO
陳述式來指定 RSA 公鑰檔案。對於群組複寫,group_replication_recovery_get_public_key
系統變數的作用相同。
對於使用 sha256_password
外掛程式的用戶端,在連線到伺服器時,密碼永遠不會以明文形式公開。密碼傳輸的方式取決於是否使用安全連線或 RSA 加密
如果連線是安全的,則不需要 RSA 金鑰對且不會使用。這適用於使用 TLS 加密的連線。密碼會以明文形式傳送,但無法被竊聽,因為連線是安全的。
注意與
caching_sha2_password
不同,sha256_password
外掛程式不會將共用記憶體連線視為安全連線,即使共用記憶體傳輸預設是安全的。如果連線不安全,且有 RSA 金鑰對可用,則連線仍會保持未加密。這適用於未使用 TLS 加密的連線。RSA 僅用於用戶端和伺服器之間的密碼交換,以防止密碼被竊聽。當伺服器收到加密的密碼時,會將其解密。加密中會使用一個擾亂,以防止重複攻擊。
如果未使用安全連線且 RSA 加密不可用,則連線嘗試會失敗,因為無法在不公開顯示為明文的情況下傳送密碼。
若要將 RSA 密碼加密與 sha256_password
搭配使用,用戶端和伺服器都必須使用 OpenSSL 編譯,而不僅僅是其中一個。
假設 MySQL 已使用 OpenSSL 編譯,請使用以下程序在用戶端連線過程中啟用 RSA 金鑰對的使用,以進行密碼交換
使用第 8.3.3 節,「建立 SSL 和 RSA 憑證和金鑰」中的指示,建立 RSA 私鑰和公鑰對檔案。
如果私鑰和公鑰檔案位於資料目錄中,且分別命名為
private_key.pem
和public_key.pem
(sha256_password_private_key_path
和sha256_password_public_key_path
系統變數的預設值),則伺服器會在啟動時自動使用它們。否則,若要明確命名金鑰檔案,請在伺服器選項檔案中將系統變數設定為金鑰檔案名稱。如果檔案位於伺服器資料目錄中,則不需要指定其完整路徑名稱
[mysqld] sha256_password_private_key_path=myprivkey.pem sha256_password_public_key_path=mypubkey.pem
如果金鑰檔案未位於資料目錄中,或者為了在系統變數值中明確指定其位置,請使用完整路徑名稱
[mysqld] sha256_password_private_key_path=/usr/local/mysql/myprivkey.pem sha256_password_public_key_path=/usr/local/mysql/mypubkey.pem
重新啟動伺服器,然後連線到伺服器並檢查
Rsa_public_key
狀態變數值。實際顯示的值與此處顯示的值不同,但應該不是空的mysql> SHOW STATUS LIKE 'Rsa_public_key'\G *************************** 1. row *************************** Variable_name: Rsa_public_key Value: -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDO9nRUDd+KvSZgY7cNBZMNpwX6 MvE1PbJFXO7u18nJ9lwc99Du/E7lw6CVXw7VKrXPeHbVQUzGyUNkf45Nz/ckaaJa aLgJOBCIDmNVnyU54OT/1lcs2xiyfaDMe8fCJ64ZwTnKbY2gkt1IMjUAB5Ogd5kJ g8aV7EtKwyhHb0c30QIDAQAB -----END PUBLIC KEY-----
如果值為空,則表示伺服器在金鑰檔案中發現了一些問題。檢查錯誤日誌以獲取診斷資訊。
在伺服器設定了 RSA 金鑰檔案後,使用 sha256_password
外掛程式進行驗證的帳戶可以選擇使用這些金鑰檔案連線到伺服器。如前所述,這些帳戶可以使用安全連線(在這種情況下不使用 RSA)或使用 RSA 執行密碼交換的未加密連線。假設使用未加密的連線。例如
$> mysql --ssl-mode=DISABLED -u sha256user -p
Enter password: password
對於 sha256user
的此連線嘗試,伺服器會判斷 sha256_password
是適當的驗證外掛程式並叫用它(因為這是在 CREATE USER
時指定的外掛程式)。外掛程式發現連線未加密,因此需要使用 RSA 加密傳輸密碼。在這種情況下,外掛程式會將 RSA 公鑰傳送給用戶端,用戶端會使用它來加密密碼並將結果傳回伺服器。外掛程式會使用伺服器端的 RSA 私鑰來解密密碼,並根據密碼是否正確來接受或拒絕連線。
伺服器會根據需要將 RSA 公鑰傳送給用戶端。但是,如果用戶端有一個包含伺服器所需 RSA 公鑰本機副本的檔案,則可以使用 --server-public-key-path
選項來指定該檔案
$> mysql --ssl-mode=DISABLED -u sha256user -p --server-public-key-path=file_name
Enter password: password
由 --server-public-key-path
選項指定的檔案中的公開金鑰值,應與伺服器端由 sha256_password_public_key_path
系統變數指定的檔案中的金鑰值相同。如果金鑰檔案包含有效的公開金鑰值,但該值不正確,則會發生拒絕存取錯誤。如果金鑰檔案不包含有效的公開金鑰,用戶端程式將無法使用它。在這種情況下,sha256_password
外掛程式會將公開金鑰傳送給用戶端,如同沒有指定 --server-public-key-path
選項一樣。
用戶端使用者可以通過兩種方式取得 RSA 公開金鑰:
資料庫管理員可以提供公開金鑰檔案的副本。
可以透過其他方式連線到伺服器的用戶端使用者可以使用
SHOW STATUS LIKE 'Rsa_public_key'
陳述式,並將傳回的金鑰值儲存在檔案中。