我的应用程序具有一个PostgreSQL模式,其中包含所有租户的所有数据。特定租户的要求是其数据必须被加密,并且必须与所有其他租户使用单独的加密密钥。
到目前为止,我还没有加密任何数据,因为它所包含的名称和电子邮件地址不多,但是客户要求这样做,所以我试图找出最好的方法。
我正在将Spring Boot与Spring Data JPA(Hibernate)和PostgreSQL一起使用。到目前为止,我所看的内容:
AttributeConverter:
这使我可以加密/解密应用程序本身中的值,并且效果很好。只需在要加密的列上添加@Convert
批注即可。
这里的一个消极方面是,当我使用SQL工具查询数据库时,我认为我无法清晰地查看解密后的数据,它必须通过Hibernate才能可读。我认为这是负面的原因是因为我要为其建立公司的公司可能需要所有租户及其数据的管理员视图,这些视图可以使用PowerBI,Google Data Studio等构建。...
ColumnTransformer:
entity属性上的@ColumnTransformer
批注,然后使用pgp_sym_encrypt
扩展名的pgp_sym_decrypt
和pgcrypto
函数。
这解决了在使用pgcrypto
扩展名之前看到的负面问题,因此我仍然可以在SQL工具中查询数据库。
-
为了“动态”设置密钥,我想我会使用类似ThreadLocal
类的东西,该类将使用已认证用户的tenantId属性从保管库中获取密钥。但是,这带来了新的问题。我的某些域实体注册的域事件是异步处理的,这意味着它们将在不同的线程中运行。这些事件处理程序将无法访问密钥...
我不认为可以使用InheritableThreadLocal
之类的东西,因为我正在使用线程池解决方案。
对于如何解决此问题,或者至少在如何正确评估权衡方面,任何想法都将受到赞赏。