PostgreSQL:使用 pgcrypto 加密列

标签 postgresql encryption postgresql-9.6 pgcrypto

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

看了几个问答后:

...并考虑这些评论:

enter image description here

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

这引出了一个问题:

将 key 存储在不同的数据库并通过外部数据包装器(例如 Postgresql_FDW)访问它是否符合最佳实践?

最佳答案

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

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

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

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

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

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

关于PostgreSQL:使用 pgcrypto 加密列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42428360/

相关文章:

SQL : select unmatching records from 2 tables

postgresql - postgres 枚举与 golang pgx

java - 使用 Keystore 存储 key

sql - 分区表上的 Postgres 查询比非分区表慢 2 倍

postgresql - 使用 distinct on 分组时无法正确排序结果

postgresql - 如何使用 Grails 2.3.4 连接 postgres 数据库

sql - 在 FROM 子句中创建一个大的虚拟表

c# - 加密 web.config 连接字符串时, key 存储在哪里?

Java 7 keytool 椭圆曲线加密

postgresql - postgres 关系中的 ALTER TYPE 错误不存在