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

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

使用信標

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

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

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

  1. 建立 AWS KMS 階層式 keyring

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

    設定信標之後,請組合階層式 keyring 先決條件建立階層式 keyring

    如需為何需要階層式 keyring 的詳細資訊,請參閱使用階層式 keyring 進行可搜尋加密

  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 } } } };
    Rust
    let beacon_version = BeaconVersion::builder() .standard_beacons(standard_beacon_list) .compound_beacons(compound_beacon_list) .version(1) // MUST be 1 .key_store(key_store.clone()) .key_source(BeaconKeySource::Single( SingleKeyStore::builder() // `keyId` references a beacon key. // For every branch key we create in the keystore, // we also create a beacon key. // This beacon key is not the same as the branch key, // but is created with the same ID as the branch key. .key_id(branch_key_id) .cache_ttl(6000) .build()?, )) .build()?; let beacon_versions = vec![beacon_version];
  3. 設定次要索引

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

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

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

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

    若要設定 Database AWS Encryption SDK 用戶端來保護 DynamoDB 資料表中的資料表項目,請參閱適用於 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子來識別包含特定子字串或集合內值的記錄。

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

  • 您可以比較複合信標的簽章部分。當您比較已簽章的組件時,您可以選擇將加密組件的字首附加到一或多個已簽章的組件,但您無法在任何查詢中包含加密欄位的值。

    例如,您可以在 signedField1 = signedField2或 上比較已簽章的組件和查詢value IN (signedField1, signedField2, ...)

    您也可以在 上透過查詢來比較已簽章的組件和已加密組件的字首signedField1.A_ = signedField2.B_

  • field BETWEEN a AND b,其中 ab是簽署的組件。您可以選擇將加密部分的字首附加到一或多個已簽章的組件,但您無法在任何查詢中包含加密欄位的值。

您必須在複合信標的查詢中包含每個部分的字首。例如,如果您從兩個欄位 encryptedField 和 建構複合信標 compoundBeaconsignedField則必須在查詢信標時包含為這兩個部分設定的字首。

compoundBeacon = E_encryptedFieldValue.S_signedFieldValue