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 键字和证书给对方。这么做需要在两边都进行一些额外的配置工作,但是这种方式提供了比简单使用用户名和口令更强的身份认证的手段。它避免一个计算机装作是服务器,然后读取客户端口令,只要时间长得足够读取客户端发送的口令就行了。它还避免了"中间人"攻击(在客户端和服务器之间有台计算机,读取然后将所有数据在客户端和服务器之间传递)。
如果系统管理员是不可信的,那么客户端加密数据也是必要的;这种情况下,未加密的数据从来不会在数据库服务器上出现。数据在发送给服务器之前加密,而数据库结果必须在客户端使用之前解密。