搜索解密列

Jav*_*der 1 postgresql encryption aws amazon-rds hsm

我在 AWS RDS 上使用 Postgres。

我的应用程序正在使用 AWS KMS 加密对表中的选定列进行加密。

我尝试过,但找不到配置 KMS 密钥并使用decrypt()in select 查询的方法。

例如,我的应用程序正在myTable.secureColumn使用 KMS 进行加密。

现在,我正在尝试触发以下查询:

select * from myTable where decrypt(secureColumn, 'key', 'aes') = 'data';
Run Code Online (Sandbox Code Playgroud)

我没有找到如何在 pgCrypto 中配置 KMS 密钥并在上面的查询中使用。

有没有人试过这个?

提前致谢。

小智 5

您尝试执行的操作将不起作用,因为pgcryptodecrypt功能不会接收您用于加密数据的 KMS 密钥。

本质上,当您设置 KMS 时,它会生成一个由公钥和私钥组成的密钥对。这些是在硬件安全模块 (HSM) 上生成的,公钥是您可以查询 KMS api 的东西。私钥保留在 HSM 上并且永远不会离开它。您可以使用 api 将数据交给它进行解密,但您无法收到密钥;使用 KMS 的全部意义在于私钥仍然保密,即使对您也是如此。

在 RDS postgres 上设置 KMS 确实让您获得的是您的表空间和备份是加密的。如果您还想在使用--storage-encrypted True标志集创建数据库时提供的静态数据保护之上进行行级加密;您将需要为此管理另一组密钥。

正确的方法是生成对称加密密钥,然后使用 KMS 主密钥进行加密。您的应用程序将在启动时使用 API 解密这些密钥,并将它们保留在内存中,将它们与需要解密操作的每个查询一起传递到数据库。

根据定义,对加密列进行索引是不可能的,因为对于没有密钥的任何人来说,密文应该是随机的。即使您有查看列的密钥,您在上面发布的查询也会很慢,因为它必须对每一行执行解密操作。一般来说,如果您使用行级加密,您希望加密依赖属性而不是密钥属性;因为选择、排序和搜索都需要访问值的明文。