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 证书。这需要双方进行额外的配置,但它提供了比仅使用密码更强的身份验证。它可以防止一台计算机冒充服务器以读取客户端发送的密码。它还有助于防止“中间人”攻击,即客户端和服务器之间的计算机冒充服务器并读取和传递所有客户端与服务器之间的数据。

客户端加密

如果服务器机器的系统管理员不可信,则有必要由客户端加密数据;这样,未加密的数据永远不会出现在数据库服务器上。数据在发送到服务器之前在客户端加密,数据库结果在被使用之前必须在客户端解密。

提交更正

如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。