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
您尝试执行的操作将不起作用,因为pgcrypto
的decrypt
功能不会接收您用于加密数据的 KMS 密钥。
本质上,当您设置 KMS 时,它会生成一个由公钥和私钥组成的密钥对。这些是在硬件安全模块 (HSM) 上生成的,公钥是您可以查询 KMS api 的东西。私钥保留在 HSM 上并且永远不会离开它。您可以使用 api 将数据交给它进行解密,但您无法收到密钥;使用 KMS 的全部意义在于私钥仍然保密,即使对您也是如此。
在 RDS postgres 上设置 KMS 确实让您获得的是您的表空间和备份是加密的。如果您还想在使用--storage-encrypted True
标志集创建数据库时提供的静态数据保护之上进行行级加密;您将需要为此管理另一组密钥。
正确的方法是生成对称加密密钥,然后使用 KMS 主密钥进行加密。您的应用程序将在启动时使用 API 解密这些密钥,并将它们保留在内存中,将它们与需要解密操作的每个查询一起传递到数据库。
根据定义,对加密列进行索引是不可能的,因为对于没有密钥的任何人来说,密文应该是随机的。即使您有查看列的密钥,您在上面发布的查询也会很慢,因为它必须对每一行执行解密操作。一般来说,如果您使用行级加密,您希望加密依赖属性而不是密钥属性;因为选择、排序和搜索都需要访问值的明文。