支援的版本: 目前 (17) / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11

20.5. 密碼驗證 #

有幾種基於密碼的驗證方法。這些方法的運作方式相似,但在使用者密碼儲存在伺服器上的方式以及客戶端提供的密碼如何透過連線傳送方面有所不同。

scram-sha-256

方法 scram-sha-256 執行 SCRAM-SHA-256 驗證,如 RFC 7677 中所述。它是一種挑戰-回應機制,可防止在不受信任的連線上進行密碼嗅探,並支援以加密雜湊形式將密碼儲存在伺服器上,該形式被認為是安全的。

這是目前提供的方法中最安全的一種,但較舊的客戶端程式庫不支援它。

md5

方法 md5 使用自訂的安全性較低的挑戰-回應機制。它可以防止密碼嗅探並避免將密碼以純文字儲存在伺服器上,但如果攻擊者設法從伺服器竊取密碼雜湊,則無法提供保護。此外,如今 MD5 雜湊演算法不再被認為可以抵抗確定的攻擊。

為了簡化從 md5 方法到較新的 SCRAM 方法的轉換,如果在 pg_hba.conf 中指定 md5 作為一種方法,但伺服器上使用者的密碼是針對 SCRAM 加密的(請參閱下文),則將自動選擇基於 SCRAM 的驗證。

password

方法 password 以明文傳送密碼,因此容易受到密碼嗅探攻擊。如果可能,應始終避免使用它。如果連線受到 SSL 加密保護,則可以安全地使用 password。(儘管如果依賴使用 SSL,則 SSL 憑證驗證可能是一個更好的選擇)。

PostgreSQL 資料庫密碼與作業系統使用者密碼是分開的。每個資料庫使用者的密碼都儲存在 pg_authid 系統目錄中。可以使用 SQL 命令 CREATE ROLEALTER ROLE 管理密碼,例如,CREATE ROLE foo WITH LOGIN PASSWORD 'secret',或 psql 命令 \password。如果尚未為使用者設定密碼,則儲存的密碼為空,並且該使用者的密碼驗證將始終失敗。

不同的基於密碼的驗證方法的可用性取決於伺服器上使用者密碼的加密方式(或更準確地說,是雜湊方式)。這由配置參數 password_encryption 在設定密碼時控制。如果密碼是使用 scram-sha-256 設定加密的,則可以用於驗證方法 scram-sha-256password(但在後一種情況下,密碼傳輸將是明文)。驗證方法規範 md5 將自動切換到使用 scram-sha-256 方法,如上所述,因此它也可以工作。如果密碼是使用 md5 設定加密的,則只能用於 md5password 驗證方法規範(同樣,在後一種情況下,密碼以明文傳輸)。(以前的 PostgreSQL 版本支援將密碼以明文儲存在伺服器上。這不再可能。)要檢查目前儲存的密碼雜湊,請參閱系統目錄 pg_authid

要將現有安裝從 md5 升級到 scram-sha-256,在確保所有正在使用的客戶端程式庫都足够新以支援 SCRAM 之後,請在 postgresql.conf 中設定 password_encryption = 'scram-sha-256',使所有使用者設定新密碼,並將 pg_hba.conf 中的驗證方法規範更改為 scram-sha-256

提交更正

如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步澄清的内容,請使用此表單來報告文件問題。