我需要加密 PostgreSQL 9.6 数据库中的某些列。被加密的数据本质上是敏感的;但是,数据不是密码或其他身份验证凭据。这些数据将需要被解密以供用户进行统计分析和消费。
看了几个问答后:
- Storing encrypted data in Postgres
- https://dba.stackexchange.com/questions/24370/how-to-use-aes-encryption-in-postgresql
- https://dba.stackexchange.com/questions/59942/secure-postgresql-database-encryption
...并考虑这些评论:
...似乎使用 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/