选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.6 已于 2021 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

18.8. 加密选项 #

PostgreSQL提供了多个层次的加密,并在防止数据因数据库服务器被盗、不诚实的管理员或不安全网络等原因而泄露方面提供了很高的灵活性。为了保护医疗记录、金融交易等敏感数据,也可能需要使用加密。

密码存储加密

默认情况下,数据库用户密码以 MD5 哈希形式存储,因此管理员无法得知分配给用户的实际密码。如果客户端认证使用 MD5 加密,明文密码甚至不会暂时出现在服务器端,因为客户端会在通过网络发送前先对其进行 MD5 加密。

跨网络安全密码

pgcrypto模块允许以加密形式存储特定字段。这在只有部分数据敏感时很有用。客户端提供解密密钥,数据在服务器端解密后再发送给客户端。

指定列加密

当数据被解密并在服务器与客户端之间传输时,解密后的数据和解密密钥会在服务器端短暂存在。这就给那些可以完全访问数据库服务器的人(例如系统管理员)提供了一个短暂的机会来截获密钥和数据。

存储加密可以在文件系统层或块设备层实现。Linux 的文件系统加密方案包括 eCryptfs 和 EncFS,而 FreeBSD 使用 PEFS。块级或整盘加密方案则包括 Linux 上的 dm-crypt + LUKS,以及 FreeBSD 上的 GEOM 模块 geli 和 gbde。许多其他操作系统也支持这类功能,包括 Windows。

数据分区加密

这种机制可以防止在整台计算机或磁盘被盗时,从驱动器中直接读取未加密数据。但它无法防御文件系统已挂载时的攻击,因为在挂载之后,操作系统会提供数据的解密视图。不过,要挂载该文件系统,就必须以某种方式把加密密钥提供给操作系统,而有时这个密钥就存放在挂载该磁盘的主机上的某处。

这种机制可以防止在整台计算机或磁盘被盗时,从驱动器中直接读取未加密数据。但它无法防御文件系统已挂载时的攻击,因为在挂载之后,操作系统会提供数据的解密视图。不过,要挂载该文件系统,就必须以某种方式把加密密钥提供给操作系统,而有时这个密钥就存放在挂载该磁盘的主机上的某处。

跨网络加密数据

SSL 连接会加密通过网络发送的全部数据:密码、查询和返回的数据。pg_hba.conf 文件允许管理员指定哪些主机可以使用非加密连接(host),哪些主机必须使用 SSL 加密连接(hostssl)。此外,客户端可以指定仅通过 SSL 连接到服务器。也可以使用 StunnelSSH 加密传输。

SSL 主机认证

客户端和服务器都可以向对方提供 SSL 证书。这需要双方做一些额外配置,但它提供的认证强度高于单纯依赖密码。它可以防止某台计算机短暂冒充服务器,只为读取客户端发送的密码;同时也有助于防御中间人攻击,即某台位于客户端与服务器之间的计算机冒充服务器,读取并转发双方之间的全部数据。

客户端加密

如果服务器所在机器的系统管理员不可信,那么就有必要由客户端自行加密数据。这样一来,未加密的数据就永远不会出现在数据库服务器上。数据在发送给服务器之前就在客户端加密,而查询结果也必须在客户端解密后才能使用。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。