在这篇文章中,我们将介绍可用于加密和解密PostgreSQL数据库中数据的不同方法。拥有一些 Linux 和 PostgreSQL 经验是必要的,但拥有加密经验并不是必需的,有经验当然更好。本文是使用 Ubuntu 23.04上运行的 PostgreSQL16编写的。首先,我将介绍加密的一些动机及其对数据安全的重要性,然后查看 PostgreSQL为实现加密所提供的函数的子集。
#1 背景
#2 加密选项
PostgreSQL文档列出了数据库软件支持的 6 个加密级别。这些级别包括:
可能是最简单和最常用的加密形式。在向服务器发送之前,PostgreSQL客户端将对用户密码进行Hashing处理,然后将其存储在数据库中。这意味着明文密码永远不会存储在服务器上,这使得潜在的攻击者很难获取到它。
pgcrypto 模块提供加密函数,用于加密存储在数据库特定列中的数据。要解密数据,客户端必须通过密钥发送,并且数据在服务器端是未加密的。这意味着密钥和数据都会在服务器端短暂地暴露给具有提升权限的任何人(如数据库管理员)。
此方法并非特指 PostgreSQL,而是指操作系统在将数据写入磁盘时使用的加密。这意味着 PostgreSQL 服务器具有驱动器级别的加密功能,以阻止任何人通过物理访问服务器来读取数据。
这是指可以配置 PostgreSQL 以在网络上安全地传输数据的不同方法。SSL 和 GSSAPI 都可以通过指定主机及其加密在 pg_hba.conf 文件中进行配置。SSH 也是通过 PostgreSQL 支持的网络进行连接的常用协议。
对于此级别,客户端和服务器都必须设置为在 SSL/TLS 握手中交换 SSL 证书。一旦启用,此方法可以防止可能的攻击者冒充服务器并获取对受限信息的访问权限,也称为中间人攻击。
最后,也可能是最安全的选择是客户端在将数据发送到服务器之前自行加密数据。这意味着客户端必须在其端点管理所有加密和解密,但也消除了恶意管理员能够读取您的数据的可能性。
#3 加密函数
General Hashing
digest(data text, type text) returns bytea
data:我们想要计算其二进制Hashing值的输入数据 type:要使用的Hashing算法(supported: md5, sha1, sha224, sha256, sha384 and sha512) return:以字节数组形式生成的Hashing值
原始加密
encrypt(data bytea, key bytea, type text) returns bytea
decrypt(data bytea, key bytea, type text) returns bytea
data:表示要转换的明文(加密)或加密数据(解密)的字节数组 key:用于加密或解密数据的密钥 type:要使用的加密算法、模式和填充。这种“类型”与一般的哈希不同,因为我们有更多的选项可以定义。这些选项的格式为 algorithm – mode/pad:padding。例如,使用不带填充的 AES-CBC 加密的解密函数如下所示:
encrypt(data, 'mykey', 'aes-cbc/pad:none')
encrypt_iv(data bytea, key bytea, iv bytea, type text) returns bytea
decrypt_iv(data bytea, key bytea, iv bytea, type text) returns bytea
#4 总结




