使用 Java 和 Postgres 数据库进行客户端加密

Posted

技术标签:

【中文标题】使用 Java 和 Postgres 数据库进行客户端加密【英文标题】:Client Side Encryption with Java and Postgres Database 【发布时间】:2021-11-10 01:37:14 【问题描述】:

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

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

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

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

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

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

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

我的一些其他想法:

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

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

谢谢! :)

【问题讨论】:

在应用程序中加密比将未加密的数据发送到数据库以供pgcrypto函数处理要安全得多。 是的,我在阅读后同意在数据库中执行加密的风险似乎要大得多,但目前更新我们的应用程序代码似乎不可行。 【参考方案1】:

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

例子:

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);
    

更多细节在这里:

https://www.jooq.org/doc/latest/manual/sql-execution/fetching/data-type-conversion/ https://www.jooq.org/doc/latest/manual/code-generation/custom-data-types/

【讨论】:

感谢这似乎很有希望!我们确实已经为我们的自定义类型使用了转换器。是否可以在不更改列的自定义类型的情况下使用此方法存储加密的密文?我猜我们仍然需要改变它们。 @jban:你为什么不想使用“自定义类型”?我的意思是,您可以在每次与列交互时附加转换器:jooq.org/doc/latest/manual/sql-execution/fetching/…。但这似乎乏味且容易出错。为什么不直接将它附加到列上呢? 这就是我们最初设计数据库的方式,但我们已经将转换器附加到代码生成器中的某些列。无论如何,我会试一试并感谢您的回答!

以上是关于使用 Java 和 Postgres 数据库进行客户端加密的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data 配置和 Postgres 数据库集成(无 xml 配置)

如何在 postgres 中使用 Java 插入 json 文档

Django - 无法使用两个数据库进行测试(带有 gis 扩展的 postgres 和 mongoDB (Djongo)

java 8 到 java 11 迁移后使用 postgres db 和 spring boot 保存 JpaSystemException 的 jsonb 类型数据

Java 枚举、JPA 和 Postgres 枚举——如何让它们一起工作?

如何使用 node-postgres 进行批量插入