文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  SHA-256 可插拔驗證

8.4.1.3 SHA-256 可插拔驗證

MySQL 提供兩個驗證外掛程式,實作使用者帳戶密碼的 SHA-256 雜湊

  • caching_sha2_password:實作 SHA-256 驗證 (類似於 sha256_password),但在伺服器端使用快取以獲得更好的效能,並具有更廣泛適用的其他功能。

  • sha256_password (已棄用):實作基本的 SHA-256 驗證。

本節說明原始的非快取 SHA-2 驗證外掛程式。如需快取外掛程式的相關資訊,請參閱章節 8.4.1.2,「快取 SHA-2 可插拔驗證」

重要事項

在 MySQL 8.4 中,caching_sha2_password 是預設的驗證外掛程式,而不是 mysql_native_password (已棄用)。如需此變更對伺服器運作以及伺服器與用戶端和連接器相容性的影響資訊,請參閱將 caching_sha2_password 作為首選的驗證外掛程式

由於 caching_sha2_password 是 MySQL 8.4 中的預設驗證外掛程式,並且提供 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.17 SHA-256 驗證的外掛程式和程式庫名稱

外掛程式或檔案 外掛程式或檔案名稱
伺服器端外掛程式 sha256_password
用戶端外掛程式 sha256_password
程式庫檔案 無 (外掛程式是內建的)

以下各節提供特定於 SHA-256 可插拔驗證的安裝和使用資訊

如需 MySQL 中可插拔驗證的一般資訊,請參閱章節 8.2.17,「可插拔驗證」

安裝 SHA-256 可插拔驗證

sha256_password (已棄用) 外掛程式以伺服器和用戶端形式存在

  • 伺服器端外掛程式已內建於伺服器中,無需明確載入,且無法透過卸載來停用。

  • 用戶端外掛程式已建置於 libmysqlclient 用戶端程式庫中,任何連結至 libmysqlclient 的程式皆可使用。

使用 SHA-256 可插拔驗證

若要設定使用已棄用的 sha256_password 外掛程式進行 SHA-256 密碼雜湊的帳戶,請使用下列陳述式,其中 password 是所需的帳戶密碼:

CREATE USER 'sha256user'@'localhost'
IDENTIFIED WITH sha256_password BY 'password';

伺服器會將 sha256_password 外掛程式指派給該帳戶,並使用它來使用 SHA-256 加密密碼,並將這些值儲存在 mysql.user 系統資料表的 pluginauthentication_string 資料行中。

(如果 sha256_password 是預設外掛程式,則不需要 IDENTIFIED WITH 子句;可以使用 authentication_policy 來指定此項。)

sha256_password 支援透過安全傳輸進行連線。sha256_password 也支援在未使用加密連線的情況下,使用 RSA 進行加密密碼交換,前提是 MySQL 使用 OpenSSL 編譯,並且您要連線的 MySQL 伺服器已設定為支援 RSA(使用本節稍後提供的 RSA 設定程序)。

RSA 支援具有下列特性:

對於使用 sha256_password 外掛程式的用戶端,在連線至伺服器時,密碼永遠不會以明文顯示。密碼傳輸的方式取決於是否使用安全連線或 RSA 加密。

  • 如果連線是安全的,則不需要 RSA 金鑰對,也不會使用它。這適用於使用 TLS 加密的連線。密碼會以明文傳送,但由於連線是安全的,因此無法被窺探。

    注意

    caching_sha2_password 不同的是,已棄用的 sha256_password 外掛程式不會將共用記憶體連線視為安全,即使預設情況下共用記憶體傳輸是安全的。

  • 如果連線不安全,而且有 RSA 金鑰對可用,則連線會保持未加密。這適用於未使用 TLS 加密的連線。RSA 僅用於用戶端和伺服器之間的密碼交換,以防止密碼被窺探。當伺服器收到加密的密碼時,它會將其解密。加密中會使用擾亂,以防止重複攻擊。

  • 如果未使用安全連線且沒有 RSA 加密可用,則連線嘗試會失敗,因為密碼無法在不以明文顯示的情況下傳送。

注意

若要搭配已棄用的 sha256_password 外掛程式使用 RSA 密碼加密,用戶端和伺服器都必須使用 OpenSSL 編譯,而不僅僅是其中一個。

假設 MySQL 已使用 OpenSSL 編譯,請使用下列程序來啟用在用戶端連線過程中,使用 RSA 金鑰對進行密碼交換:

  1. 請按照 第 8.3.3 節,「建立 SSL 和 RSA 憑證與金鑰」中的指示,建立 RSA 私鑰和公鑰對檔案。

  2. 如果私鑰和公鑰檔案位於資料目錄中,且名稱分別為 private_key.pempublic_key.pemsha256_password_private_key_pathsha256_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
  3. 重新啟動伺服器,然後連線至伺服器並檢查 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' 陳述式,並將傳回的金鑰值儲存在檔案中。