web-dev-qa-db-ja.com

復号化された列に対する検索

AWS RDSでPostgresを使用しています。

私のアプリケーションは、AWS KMS暗号化を使用してテーブル内の選択した列を暗号化しています。

KMSキーを構成し、選択クエリでdecrypt()を使用する方法を試しましたが見つかりませんでした。

たとえば、私のアプリはmyTable.secureColumn KMSを使用します。

今、私はクエリの下で発射しようとしています:

select * from myTable where decrypt(secureColumn, 'key', 'aes') = 'data';

PgCryptoでKMSキーを構成し、上記のクエリで使用する方法が見つかりませんでした。

誰かがこれを試しましたか?

前もって感謝します。

1

pgcryptodecrypt関数が、データの暗号化に使用したKMSキーを受信しないため、実行しようとしていることが機能しません。

基本的に、KMSを設定すると、公開鍵と秘密鍵で構成される鍵ペアが生成されます。これらはハードウェアセキュリティモジュール(HSM)で生成され、公開鍵はKMS APIにクエリできるものです。秘密鍵はHSMに残り、決して離れることはありません。 APIを使用して復号化のためにデータを渡すことができますが、キーを受け取ることはできません。 KMSを使用する重要な点は、秘密鍵はあなたからであっても秘​​密のままであることです。

RDS postgresでKMSを設定すると、テーブルスペースとバックアップが暗号化されます。 --storage-encrypted Trueフラグを設定してデータベースを作成するときに提供される保存時データ保護に加えて、行レベルの暗号化も行いたい場合。そのためには、別のキーのセットを管理する必要があります。

これを行う正しい方法は、対称暗号化キーを生成し、それをKMSマスターキーで暗号化することです。アプリケーションはAPIを使用してこれらのキーを起動時に解読し、メモリに保持して、解読操作を必要とするすべてのクエリでデータベースに渡します。

暗号化された列のインデックス付けは、cryptextがキーを持っていない人にはランダムに見えるため、定義上不可能です。上記で投稿したクエリは、列を確認するキーがあったとしても、すべての行に対して復号化操作を実行する必要があるため、遅くなります。一般的に、行レベルの暗号化を使用している場合は、キー属性ではなく依存属性を暗号化する必要があります。選択、ソート、検索はすべて、値の平文へのアクセスを必要とするためです。

4
Larry