PostgresSQL加密用于具有1000万行的列级加密



HI All,

我们正在构建一个解决方案,在第一阶段之后,我们被要求在数据库中保护用户PI。到目前为止,我们的用户数据已达到1000万。我们已经探索了几种选择:

  1. 应用程序端加密(Spring Boot端(-具有强大的三重加密技术
  2. 数据库端的加密-让DB处理加密和解密的头痛,我们对此并不在意。我们使用JPA注释来简化我们的工作

我们采用了第二种方法,因为加密数据需要通配符搜索。如果在应用端使用AES技术,则不可能获得结果集。

现在我们可以实施了,一切都如预期的那样顺利。我们现在面临许多查询性能问题。所以我们开始创建索引。但由于我们已经加密了,所以我们必须使用解密函数创建索引,否则索引就没有任何作用。

在列上创建包含解密信息的索引是否安全。该索引将包含解密的数据。加密数据的全部目的没有任何意义。

Data Type is BYTEA and used 

pgp_sym_encrypt用于加密。

类似地使用

pgp_sym_decrypt通过传递密钥进行解密

为了创建索引,我们必须将索引创建为

CREATE INDEX INDEX_1 on table(pgp_sym_decrypt(,'key'(VARCHAR_pattern_ops(;

上述索引是否存在可见性问题。另外,还有其他选择吗?可以为Postgres表寻找列级加密,并通过创建索引来执行查询优化。

是否还有其他选项,如"保护表空间"。请给我点光

为解密该数据的表达式创建索引将把解密的数据存储在磁盘上,是的。听起来应该在块设备级别使用加密(例如,全磁盘加密(。使用一个指向操作系统处理加密的文件系统路径的表空间会让您获得部分路径,但即便如此,您也应该意识到,如果您使用任何解密数据进行排序,如果排序的大小足以溢出您配置的work_mem,则这些解密的值将写入临时文件。使用任何解密数据的联接也是如此,因为当存在联接时,查询计划器通常会使用排序作为查询计划的一部分。

如果您的要求是解密后的数据永远不会写入磁盘,那么您应该真正使用操作系统级别的功能;如果没有严格的限制(比如从不使用解密值的表达式索引,从不对解密的数据进行排序或连接(,数据库服务器就无法独自完成这项工作。

最新更新