使用信標 - AWS 資料庫加密 SDK

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用信標

我們的用戶端加密程式庫已重新命名為 AWS 資料庫加密 SDK。本開發人員指南仍提供 DynamoDB 加密用戶端的相關資訊。

信標 (Beacon) 可讓您搜尋加密的記錄,而無需解密所查詢的整個資料庫。信標的設計是要在新的、未填入的資料庫中實作。在現有資料庫中設定的任何信標只會對應寫入資料庫的新記錄。信標是根據欄位的純文字值計算的,一旦欄位經過加密,信標就無法對應現有資料。使用信標寫入新記錄之後,就無法更新信標的組態。不過,您可以為新增至記錄的新欄位新增信標。

設定信標之後,您必須先完成下列步驟,才能開始填入資料庫並對信標執行查詢。

  1. 建立 AWS KMS 階層式金鑰圈

    若要使用可搜尋的加密,您必須使用AWS KMS 階層式金鑰環來產生、加密和解密用於保護記錄的資料金鑰

    設定信標之後,請組合階層式金鑰圈先決條件建立階層式金鑰圈。

    如需有關為何需要階層式金鑰圈的詳細資訊,請參閱使用階層式金鑰圈進行可搜尋的加密。

  2. 定義信標版本

    指定您的keyStorekeySource、您設定的所有標準信標清單、您設定的所有複合信標清單、加密零件清單、已簽署零件的清單,以及信標版本。您必須1為信標版本指定。如需定義您的指引keySource,請參閱定義信標金鑰來源

    下列 Java 範例會定義單一承租人資料庫的信標版本。如需定義多租戶資料庫之信標版本的說明,請參閱多租戶資料庫的可搜尋加密

    Java
    List<BeaconVersion> beaconVersions = new ArrayList<>(); beaconVersions.add( BeaconVersion.builder() .standardBeacons(standardBeaconList) .compoundBeacons(compoundBeaconList) .encryptedParts(encryptedPartsList) .signedParts(signedPartsList) .version(1) // MUST be 1 .keyStore(keyStore) .keySource(BeaconKeySource.builder() .single(SingleKeyStore.builder() .keyId(branchKeyId) .cacheTTL(6000) .build()) .build()) .build() );
    C# / .NET
    var beaconVersions = new List<BeaconVersion> { new BeaconVersion { StandardBeacons = standardBeaconList, CompoundBeacons = compoundBeaconList, EncryptedParts = encryptedPartsList, SignedParts = signedPartsList, Version = 1, // MUST be 1 KeyStore = branchKeyStoreName, KeySource = new BeaconKeySource { Single = new SingleKeyStore { KeyId = branch-key-id, CacheTTL = 6000 } } } };
  3. 設定次要索引

    設定信標之後,您必須先設定反映每個信標的次要索引,才能搜尋加密欄位。如需詳細資訊,請參閱 使用信標設定次要索引

  4. 定義您的密碼編譯動作

    必須標記用於建構標準信標的所有欄位ENCRYPT_AND_SIGN。用於構造信標的所有其他字段必須標記SIGN_ONLYSIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT

  5. 設定資 AWS 料庫加密 SDK 用戶端

    若要設定可保護 DynamoDB 表格中表項目的 AWS 資料庫加密 SDK 用戶端,請參閱 DynamoDB 的 Java 用戶端加密程式庫

查詢信標

您設定的信標類型會決定您可以執行的查詢類型。標準信標使用篩選運算式來執行相等搜尋。複合信標結合文字純文字字串和標準信標,以執行複雜的查詢。當您查詢加密的資料時,您會搜尋信標名稱。

您無法比較兩個標準信標的值,即使它們包含相同的基礎純文字也一樣。兩個標準信標將為相同的明文值產生兩個不同的 HMAC 標籤。因此,標準信標無法執行下列查詢。

  • beacon1 = beacon2

  • beacon1 IN (beacon2)

  • value IN (beacon1, beacon2, ...)

  • CONTAINS(beacon1, beacon2)

複合信標可以執行以下查詢。

  • BEGINS_WITH(a),其中a反映組合化合物信標開始於之欄位的整個值。您無法使用BEGINS_WITH運算子來識別以特定子字串開頭的值。但是,您可以使用BEGINS_WITH(S_),其中S_反映組裝化合物信標開頭之零件的字首。

  • CONTAINS(a),其中a反映組合化合物信標所包含之欄位的整個值。您無法使用CONTAINS運算子來識別包含特定子字串或集合中值的記錄。

    例如,您無法執行a反映集合中值的查詢CONTAINS(path, "a"

  • 您可以比較複合信標的簽名部分。比較已簽署零件時,您可以選擇性地將加密零件的前置詞附加到一或多個已簽署零件,但不能在任何查詢中包含加密欄位的值。

    例如,您可以比較已簽署的零件,並在signedField1 = signedField2或上進行查詢value IN (signedField1, signedField2, ...)

    您也可以透過上的查詢來比較已簽署零件與加密零件的字首signedField1.A_ = signedField2.B_

  • field BETWEEN a AND b,在哪裡a和簽名b的部分。您可以選擇性地將加密零件的前置詞附加到一或多個已簽署零件,但不能在任何查詢中包含加密欄位的值。

您必須包含在複合信標的查詢中的每個零件的前置詞。例如,如果您從兩個欄位建構複合信標 compoundBeaconsignedFieldencryptedField並且在查詢信標時,必須包含為這兩個部分設定的首碼。

compoundBeacon = E_encryptedFieldValue.S_signedFieldValue