PostgreSQL:使用pgcrypto加密列

los*_*rse 8 encryption postgresql pgcrypto postgresql-9.6

我需要加密PostgreSQL 9.6数据库中的一些列.被加密的数据本质上是敏感的; 但是,数据不是密码或其他身份验证凭据.需要对这些数据进行解密,以供用户进行统计分析和消费.

看完几个问题和答案后:

......并考虑以下评论:

在此输入图像描述

...使用pgcrypto模块似乎最大的问题是在同一个数据库中存储密钥.

这引出了一个问题:

是否与将密钥存储在不同数据库中并通过外部数据包装器(如Postgresql_FDW)访问它的最佳实践一致?

Tri*_*Yop 3

秘密存储是使用加密机制时的一个常见问题。

pgcrypto 不提供密钥存储,您可以自由地将密钥存储在您想要的位置并尽可能地保护它。

如果由同一个 DBA 管理,将密钥存储在另一个数据库中并不能提供太多的安全性,因为 DBA 可能会以相同的方式访问它。

理想情况下,您可以将密钥存储在安全的保管库中,并从应用程序请求它以构建查询。当请求运行时,DBA 仍然可以看到它select * from pg_stat_activity

您可以设置 SQL 会话广泛使用的密钥,set session my.vars.cryptokey = 'secret';然后使用以下语法将其用于查询中:current_setting('my.vars.cryptokey')::text

为了从应用程序的角度来看(几乎)透明,PostgreSQL 规则可能有助于转换secure_column为使用会话存储密钥调用解密函数。对于插入,需要预插入触发器。