動態

詳情 返回 返回

初學者指南 | PostgreSQL中的加密機制如何運作? - 動態 詳情

在這篇文章中,我們將介紹可用於加密和解密PostgreSQL數據庫中數據的不同方法。擁有一些 Linux 和 PostgreSQL 經驗是必要的,但擁有加密經驗並不是必需的,有經驗當然更好。本文是使用 Ubuntu 23.04上運行的 PostgreSQL16編寫的。首先,我將介紹加密的一些動機及其對數據安全的重要性,然後查看 PostgreSQL為實現加密所提供的函數的子集。

1 背景

雖然我們在日常生活中很少與加密進行交互,但它對於我們的敏感信息(如銀行、醫療保健等)的安全至關重要。通常,加密過程會遠離終端用户,隱藏所有複雜的數學和算法,讓我們只需輸入密碼,就可以完成所有操作。但是,這些抽象需要權衡,因為我們必須相信解密我們數據的人不會對其進行復制或進行其他惡意行為。在這篇博客中,我們將介紹 PostgreSQL 用於加密數據的不同方法,以及我們在使用它們時遇到的權衡。

2 加密選項

PostgreSQL文檔列出了數據庫軟件支持的 6 個加密級別。這些級別包括:

2.1密碼加密
可能是最簡單和最常用的加密形式。在向服務器發送之前,PostgreSQL客户端將對用户密碼進行Hashing處理,然後將其存儲在數據庫中。這意味着明文密碼永遠不會存儲在服務器上,這使得潛在的攻擊者很難獲取到它。

2.2特定列的加密
pgcrypto 模塊提供加密函數,用於加密存儲在數據庫特定列中的數據。要解密數據,客户端必須通過密鑰發送,並且數據在服務器端是未加密的。這意味着密鑰和數據都會在服務器端短暫地暴露給具有提升權限的任何人(如數據庫管理員)。

2.3數據分區加密
此方法並非特指 PostgreSQL,而是指操作系統在將數據寫入磁盤時使用的加密。這意味着 PostgreSQL 服務器具有驅動器級別的加密功能,以阻止任何人通過物理訪問服務器來讀取數據。

2.4加密網絡上的數據
這是指可以配置 PostgreSQL 以在網絡上安全地傳輸數據的不同方法。SSL 和 GSSAPI 都可以通過指定主機及其加密在 pg_hba.conf 文件中進行配置。SSH 也是通過 PostgreSQL 支持的網絡進行連接的常用協議。

2.5SSL主機身份驗證
對於此級別,客户端和服務器都必須設置為在 SSL/TLS 握手中交換 SSL 證書。一旦啓用,此方法可以防止可能的攻擊者冒充服務器並獲取對受限信息的訪問權限,也稱為中間人攻擊。

2.6客户端加密
最後,也可能是最安全的選擇是客户端在將數據發送到服務器之前自行加密數據。這意味着客户端必須在其端點管理所有加密和解密,但也消除了惡意管理員能夠讀取您的數據的可能性。

3 加密函數

所有這些函數以及更多功能都記錄在 pgcrypto 模塊的 PostgreSQL 文檔中。

  • General Hashing
    Digest 函數:
digest(data text, type text) returns bytea

此函數根據“類型”中指定的加密方法,將存儲在變量“data”中的數據轉換為字節數組表示的二進制Hashing。

data:我們想要計算其二進制Hashing值的輸入數據
type:要使用的Hashing算法(supported: md5, sha1, sha224, sha256, sha384 and sha512)
return:以字節數組形式生成的Hashing值

  • 原始加密
    這些函數只是在輸入的數據上運行密碼,並不提供任何形式的密鑰或初始化向量 (IV) 的管理。所有這些管理都應由用户處理,通常不建議在實際使用時使用。
encrypt(data bytea, key bytea, type text) returns bytea
decrypt(data bytea, key bytea, type text) returns bytea

正如我們所看到的,encrypt 和 decrypt 函數都採用相同的參數並返回相同的類型。唯一的區別是 'data' 是 encrypt() 中的明文字節數組,而在 decrypt() 中,'data' 是加密數據的字節數組。

data:表示要轉換的明文(加密)或加密數據(解密)的字節數組
key:用於加密或解密數據的密鑰
type:要使用的加密算法、模式和填充。這種“類型”與一般的哈希不同,因為我們有更多的選項可以定義。這些選項的格式為 algorithm – mode/pad:padding。例如,使用不帶填充的 AES-CBC 加密的解密函數如下所示:

encrypt(data, 'mykey', 'aes-cbc/pad:none')

原始加密還支持另外兩個函數形式的 IV:

encrypt_iv(data bytea, key bytea, iv bytea, type text) returns bytea
decrypt_iv(data bytea, key bytea, iv bytea, type text) returns bytea

這些函數與它們的非 IV 對應函數幾乎相同,但包含一個額外的參數,用於定義算法的初始化向量。

4 總結

在這篇博客中,我們介紹了PostgreSQL 提供的許多功能,用於加密和解密數據庫內部和周圍的數據。首先,我們談到了加密的重要性以及我們在使用它時所做的權衡。然後,我們查看了 PostgreSQL 支持的不同加密級別及其在數據庫中的功能。最後,我們研究了 PostgreSQL附帶的一些加密實現,它們的使用案例以及如何使用它們。總體而言,加密對於我們的在線安全至關重要,並且如果您計劃開發任何需要網絡連接的內容,那麼瞭解它是非常必要的。我希望這篇博客有助於你深入瞭解加密以及它在PostgreSQL中如何工作,同時能夠啓發你在未來的項目中實施這些安全措施。

user avatar zeran 頭像 yichenliu 頭像 jianweilai 頭像 lfree 頭像 qiumi_685b70038c171 頭像 weidejianpan 頭像 openanolis 頭像
點贊 7 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.