【问题标题】:PostgresSQL crypto used for column level encryption which had 10 Million rowsPostgresQL 加密用于具有 1000 万行的列级加密
【发布时间】:2020-09-25 15:25:41
【问题描述】:

大家好,

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

  1. 应用程序端(Spring Boot 端)加密 - 具有强大的三重加密技术。
  2. 数据库端的加密 - 让 DB 处理加密和解密的难题,我们不会为此烦恼。我们使用 JPA 注释来简化自己。

我们采用了第二种方法,因为加密数据会出现通配符搜索。如果我们在应用端使用 AES 技术做,是不可能得到结果集的。

现在我们可以实施并且一切都按预期正常工作。我们现在面临很多查询性能问题。所以我们去创建索引。但是由于我们已经加密了,我们必须使用解密函数创建索引,否则索引没有任何作用。

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

Data Type is BYTEA and used 

pgp_sym_encrypt 用于加密。

类似使用

pgp_sym_decrypt 用于通过密钥解密

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

在表上创建索引 index_1(pgp_sym_decrypt(, 'key') VARCHAR_pattern_ops);

上述索引在可见性方面是否存在任何问题。另外还有其他替代方法可以为 Postgres 表查找列级加密并通过创建索引来执行查询优化。

是否还有其他选项,例如保护表空间。请给我一些启发

【问题讨论】:

    标签: postgresql spring-boot encryption cryptography


    【解决方案1】:

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

    如果您的要求是解密后的数据永远不会写入磁盘,那么您确实应该使用操作系统级别的功能;这不是数据库服务器可以在没有严格限制的情况下自行完成的事情(例如从不使用解密值的表达式索引,从不对解密的数据进行排序或连接)。

    【讨论】:

    • 感谢亚当的回复。甚至我对列级别的加密也有相同的看法。
    猜你喜欢
    • 2021-07-19
    • 2015-03-22
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多