PostgreSQL 提供了幾個不同級彆的加密,並且在保護數據庫服務器不受數據竊賊、不道德管理員、不安全網絡等因素泄漏的方麵提供很高的靈活性。加密可能也是保護一些諸如醫療記錄和財務交易等敏感數據的要求。
缺省的時候,數據庫用戶的口令以 MD5 散列的方式存儲,所以管理員無法判斷賦予用戶的實際口令。如果 MD5 加密用於客戶端認證,那麼未加密的口令甚至都不可能臨時出現在服務器上,因為客戶端在透過網絡發送之前,就先用 MD5 加密了。
/contrib 函數庫 pgcrypto
允許對某些字段進行加密存儲。這個功能在某些數據是敏感的情況下有用。客戶端提供解密的密鑰,然後數據在服務器端解密,然後發送給客戶端。
在數據解密和數據在服務器與客戶端之間傳遞時,解密數據和解密密鑰將會在服務器端存在短暫的一段時間。這就給那些可以完全訪問數據庫服務器的人提供了一個短暫的截獲密鑰和數據的時間,這樣的人一般是數據庫管理員。
在 Linux 上,加密可以在使用"回環設備"(loopback device)掛載的文件係統上麵進行。這樣就可以把磁盤上整個文件分區都加密,然後由操作係統解密。在 FreeBSD 上,等效的設施叫 GEOM 基本磁盤加密(GEOM Base Disk Encryption),或者 gbde 。
這個機製避免了在整個計算機或者磁盤驅動器被竊的情況下,未加密的數據被從驅動器中讀取。它無法防止在文件係統被掛載的時候的攻擊,因為在掛載之後,操作係統提供數據的解密視圖。不過,要想掛載文件係統,你需要有一些方法把解密密鑰傳遞給操作係統,有時候這個密鑰就存儲在掛載該磁盤的主機的某個地方。
MD5 認證方法在客戶端將口令發給服務器之前雙重加密之。第一次 MD5 加密是基於用戶名的,然後在連接數據庫的時候,用服務器發送的隨機鹽粒再次加密。這個雙重加密的數值就是從網絡傳遞給服務器的數值。雙重加密不僅可以避免口令泄漏,還可以避免稍後其它的連接使用同樣的加密口令連接數據庫(回放攻擊)。
SSL 連接加密所有透過網絡發送的數據:口令、查詢、返回的數據。pg_hba.conf 文件允許管理員聲明哪些主機可以使用不加密的連接(host),以及哪些主機需要使用 SSL 加密的連接(hostssl)。我們可以使用 Stunnel 或 SSH 加密數據傳輸。
客戶端和主機都可以提供 SSL 鍵字和證書給對方。這麼做需要在兩邊都進行一些額外的配置工作,但是這種方式提供了比簡單使用用戶名和口令更強的身份認證的手段。它避免一個計算機裝作是服務器,然後讀取客戶端口令,隻要時間長得足夠讀取客戶端發送的口令就行了。它還避免了"中間人"攻擊(在客戶端和服務器之間有台計算機,讀取然後將所有數據在客戶端和服務器之間傳遞)。
如果係統管理員是不可信的,那麼客戶端加密數據也是必要的;這種情況下,未加密的數據從來不會在數據庫服務器上出現。數據在發送給服務器之前加密,而數據庫結果必須在客戶端使用之前解密。