1

我已经对客户端每租户加密的实现进行了大量的挖掘和研究,但对于我应该如何继续我们的应用程序感到有些困惑。在某些背景下,我们有一个dropwizard应用程序,它有许多自定义 DAO,它们postgres使用jooq. 我们的数据库有许多表、自定义函数和自定义用户定义的数据类型。我们的要求是我们客户的一些敏感数据需要加密(数据库表中的某些列)。数据按每个租户的行进行分区。

我知道我有两个选择将数据加密放在哪里。

  1. 在我们的应用程序中
  2. 在我们的postgres数据库中

这是我在探索上述两个选项时发现的:

虽然将加密放在我们的应用程序中是我最初的计划,但必须编辑每个 DAO 可能会导致许多问题并花费大量时间。

因此,我研究了让数据库使用 pgcrypto 和列侧加密来处理加密的替代方案。但是,就像前面提到的那样,由于我们对列的所有自定义数据类型,我无法为这些自定义数据类型列存储任何加密数据,因为加密数据以bytea. 修剪文档和其他堆栈溢出帖子除了更改这些列的数据类型以接受 bytea 与我希望尽可能避免的自定义类型之外,我无法找到解决方案。

在此之后,我对下一步如何最好地进行有点困惑,因为我在这里列出的两个选项都需要大量时间,并且可能会破坏我们的很多应用程序。

我有其他一些想法:

  1. 我已经调查jooqliquibase进行了加密,但在那里找不到任何东西。
  2. 无需更新列的数据类型,只需创建一个新的加密版本的数据库并使用视图来表示表的明文。

我的大问题:鉴于这里的背景信息,是否有任何建议或替代方案来实施客户端加密?(对我们当前架构的破坏最小)

谢谢!:)

4

1 回答 1

0

Converter<String, String>如果您使用代码生成器将其附加到这些列,您可以轻松地使用在所有所需列上透明地实现加密/解密的 jOOQ 。

例子:

public class EncryptionConverter extends AbstractConverter<String, String> {
    public EncryptionConverter() {
        super(String.class, String.class);
    }

    @Override
    public String from(String databaseObject) {
        return EncryptUtil.decrypt(databaseObject);
    }

    @Override
    public String to(String userObject) {
        return EncryptUtil.encrypt(userObject);
    }
}

更多细节在这里:

于 2021-09-15T06:32:09.223 回答