2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0

18.8. 加密選項 #

PostgreSQL 在多個級別提供加密,並靈活地保護資料免遭資料庫伺服器被盜、不誠實的管理員以及不安全網路洩露。加密也可能是保護敏感資料(如醫療記錄或金融交易)的必要措施。

密碼加密

資料庫使用者密碼以雜湊值的形式儲存(由設定 password_encryption 確定),因此管理員無法確定分配給使用者的實際密碼。如果使用 SCRAM 或 MD5 加密進行客戶端身份驗證,則未加密的密碼甚至不會臨時出現在伺服器上,因為客戶端在網路傳輸之前會對其進行加密。SCRAM 是首選,因為它是一種網際網路標準,並且比 PostgreSQL 特有的 MD5 身份驗證協議更安全。

警告

MD5 加密密碼的支援已棄用,將在 PostgreSQL 的未來版本中移除。有關遷移到其他密碼型別的詳細資訊,請參閱第 20.5 節

特定列的加密

pgcrypto 模組允許某些欄位以加密形式儲存。如果只有部分資料是敏感的,這會很有用。客戶端提供解密金鑰,資料在伺服器上解密,然後傳送給客戶端。

解密後的資料和解密金鑰在解密和客戶端-伺服器通訊期間會在伺服器上短暫存在。這提供了一個短暫的時刻,資料和金鑰可能會被對資料庫伺服器擁有完全訪問許可權的任何人(例如系統管理員)截獲。

資料分割槽加密

儲存加密可以在檔案系統級別或塊級別執行。Linux 檔案系統加密選項包括 eCryptfs 和 EncFS,而 FreeBSD 使用 PEFS。塊級別或全盤加密選項包括 Linux 上的 dm-crypt + LUKS 以及 FreeBSD 上的 GEOM 模組 geli 和 gbde。許多其他作業系統也支援此功能,包括 Windows。

此機制可防止在驅動器或整個計算機被盜時從驅動器中讀取未加密的資料。當檔案系統已掛載時,此機制無法防止攻擊,因為當掛載時,作業系統會提供資料的未加密檢視。但是,要掛載檔案系統,您需要某種方式將加密金鑰傳遞給作業系統,有時金鑰會儲存在掛載磁碟的主機上的某個位置。

透過網路加密資料

SSL 連線會加密在網路上傳輸的所有資料:密碼、查詢和返回的資料。pg_hba.conf 檔案允許管理員指定哪些主機可以使用非加密連線(host),哪些需要 SSL 加密連線(hostssl)。此外,客戶端可以指定它們僅透過 SSL 連線到伺服器。

GSSAPI 加密連線會加密在網路上傳輸的所有資料,包括查詢和返回的資料。(沒有密碼會透過網路傳輸。)pg_hba.conf 檔案允許管理員指定哪些主機可以使用非加密連線(host),哪些需要 GSSAPI 加密連線(hostgssenc)。此外,客戶端可以指定它們僅透過 GSSAPI 加密連線(gssencmode=require)連線到伺服器。

StunnelSSH 也可用於加密傳輸。

SSL 主機身份驗證

客戶端和伺服器都可以相互提供 SSL 證書。這需要雙方進行額外的配置,但它提供了比僅使用密碼更強的身份驗證。它可以防止一臺計算機冒充伺服器以讀取客戶端傳送的密碼。它還有助於防止“中間人”攻擊,即客戶端和伺服器之間的計算機冒充伺服器並讀取和傳遞所有客戶端與伺服器之間的資料。

客戶端加密

如果伺服器機器的系統管理員不可信,則有必要由客戶端加密資料;這樣,未加密的資料永遠不會出現在資料庫伺服器上。資料在傳送到伺服器之前在客戶端加密,資料庫結果在被使用之前必須在客戶端解密。

提交更正

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