

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

# 可搜尋加密
<a name="searchable-encryption"></a>


****  

|  | 
| --- |
| 我們的用戶端加密程式庫已重新命名為 AWS 資料庫加密 SDK。此開發人員指南仍提供有關 [DynamoDB 加密用戶端](legacy-dynamodb-encryption-client.md)的資訊。 | 

可搜尋加密可讓您在不解密整個資料庫的情況下搜尋加密的記錄。這是使用*信標來完成的*，該信標會在寫入欄位的純文字值與實際存放在資料庫中的加密值之間建立映射。 AWS Database Encryption SDK 會將信標存放在新增至記錄的新欄位中。根據您使用的信標類型，您可以對加密的資料執行完全相符的搜尋或更自訂的複雜查詢。

**注意**  
 AWS 資料庫加密 SDK 中的可搜尋加密與學術研究定義的可搜尋對稱加密不同，例如[可搜尋對稱加密](https://dl.acm.org/doi/10.1145/1180405.1180417)。



信標是截斷的雜湊型訊息驗證碼 (HMAC) 標籤，可在純文字和欄位的加密值之間建立映射。當您將新值寫入設定為可搜尋加密的加密欄位時， AWS 資料庫加密 SDK 會透過純文字值計算 HMAC。此 HMAC 輸出是該欄位純文字值的一對一 (1：1) 比對。HMAC 輸出會截斷，讓多個不同的純文字值對應至相同的截斷 HMAC 標籤。這些誤報會限制未經授權的使用者識別純文字值辨別資訊的能力。當您查詢信標時， AWS 資料庫加密 SDK 會自動篩選掉這些誤報，並傳回查詢的純文字結果。

為每個信標產生的偽陽性平均數量取決於截斷後剩餘的信標長度。如需判斷適合您實作之信標長度的說明，請參閱[判斷信標長度](choosing-beacon-length.md)。

**注意**  
可搜尋加密旨在實作在新的、未填入的資料庫中。在現有資料庫中設定的任何信標只會映射上傳至資料庫的新記錄，信標無法映射現有資料。

**主題**
+ [信標是否適合我的資料集？](#are-beacons-right-for-me)
+ [可搜尋的加密案例](#beacon-overview-example)

## 信標是否適合我的資料集？
<a name="are-beacons-right-for-me"></a>

使用信標對加密的資料執行查詢，可降低與用戶端加密資料庫相關聯的效能成本。當您使用信標時，查詢的效率與資料分佈的公開資訊量之間存在固有權衡。信標不會變更 欄位的加密狀態。當您使用 AWS 資料庫加密 SDK 加密和簽署欄位時，該欄位的純文字值永遠不會公開給資料庫。資料庫會存放 欄位的隨機加密值。

信標會與其計算來源的加密欄位一起存放。這表示即使未經授權的使用者無法檢視加密欄位的純文字值，他們也可以對信標執行統計分析，以進一步了解資料集的分佈，並在極端情況下識別信標映射到的純文字值。您設定信標的方式可以減輕這些風險。特別是，[選擇正確的信標長度](choosing-beacon-length.md)可協助您保護資料集的機密性。

**安全性與效能**
+ 信標長度越短，保留的安全性就越高。
+ 信標長度越長，保留的效能就越多。

可搜尋加密可能無法為所有資料集提供所需的效能和安全性層級。在設定任何信標之前，請先檢閱您的威脅模型、安全需求和效能需求。

當您判斷可搜尋加密是否適合您的資料集時，請考慮下列資料集唯一性要求。

**分佈**  
信標保留的安全數量取決於資料集的分佈。當您設定可搜尋加密的加密欄位時， AWS 資料庫加密 SDK 會透過寫入該欄位的純文字值來計算 HMAC。針對特定欄位計算的所有信標都是使用相同的金鑰計算，但每個租用戶使用不同金鑰的多租用戶資料庫除外。這表示如果多次將相同的純文字值寫入 欄位，則會針對該純文字值的每個執行個體建立相同的 HMAC 標籤。  
您應該避免從包含非常常見值的欄位建構信標。例如，假設資料庫存放伊利諾州每個居民的地址。如果您從加密`City`欄位建構信標，則由於在芝加哥居住的伊利諾州人口中有很大比例，透過「芝加哥」計算的信標將過度表示。即使未經授權的使用者只能讀取加密的值和信標值，如果信標保留此分佈，他們也可以識別哪些記錄包含芝加哥居民的資料。若要將分佈的辨別資訊量降至最低，您必須充分截斷您的信標。隱藏此不均勻分佈所需的信標長度具有顯著的效能成本，可能不符合應用程式的需求。  
您必須仔細分析資料集的分佈，以確定需要截斷多少信標。截斷後剩餘的信標長度會直接與可辨識分佈的統計資訊量相關。您可能需要選擇較短的信標長度，以充分減少顯示有關資料集的辨別資訊量。  
在極端情況下，您無法計算分佈不均勻資料集的信標長度，以有效地平衡效能和安全性。例如，您不應該從存放罕見疾病醫療測試結果的欄位建構信標。由於預期`NEGATIVE`結果在資料集內會明顯更普遍，因此可以透過結果的罕見程度輕鬆識別`POSITIVE`結果。當 欄位只有兩個可能的值時，隱藏分佈非常困難。如果您使用的信標長度短到足以隱藏分佈，所有純文字值都會對應到相同的 HMAC 標籤。如果您使用較長的信標長度，很明顯哪些信標會映射到純文字`POSITIVE`值。

**關聯性**  
我們強烈建議您避免從具有相關值的欄位建構不同的信標。從相關欄位建構的信標需要較短的信標長度，才能充分將每個資料集分發給未經授權使用者的資訊量降至最低。您必須仔細分析資料集，包括其熵和相關值的關節分佈，以確定需要截斷多少信標。如果產生的信標長度不符合您的效能需求，則信標可能不適合您的資料集。  
例如，您不應該從 `City`和 `ZIPCode` 欄位建構兩個單獨的信標，因為郵遞區號可能只會與一個城市相關聯。一般而言，信標產生的誤報會限制未經授權的使用者識別資料集辨別資訊的能力。但是， `City`和 `ZIPCode` 欄位之間的相互關聯意味著未經授權的使用者可以輕鬆識別哪些結果是誤報，並區分不同的郵遞區號。  
您也應該避免從包含相同純文字值的欄位建構信標。例如，您不應該從 `mobilePhone`和 `preferredPhone` 欄位建構信標，因為它們可能具有相同的值。如果您從這兩個欄位建構不同的信標， AWS 資料庫加密 SDK 會在不同的金鑰下為每個欄位建立信標。這會為相同的純文字值產生兩個不同的 HMAC 標籤。這兩個不同的信標不太可能有相同的誤報，未經授權的使用者可能可以區分不同的電話號碼。

即使您的資料集包含關聯欄位或分佈不均勻，您還是可以建構信標，以使用較短的信標長度來維護資料集的機密性。不過，信標長度不保證資料集中的每個唯一值都會產生許多誤報，以有效地將資料集的辨別資訊量降至最低。信標長度僅估計產生的誤報平均數量。資料集的分佈越不平均，有效信標長度就越低，決定了產生的誤報平均數量。

仔細考慮您建構信標的欄位分佈，並考慮需要多少時間才能截斷信標長度以符合您的安全需求。本章中的下列主題假設您的信標是統一分佈的，且不包含相互關聯的資料。

## 可搜尋的加密案例
<a name="beacon-overview-example"></a>

下列範例示範簡單的可搜尋加密解決方案。在應用程式中，此範例中使用的範例欄位可能不符合信標的分佈和相互關聯唯一性建議。您可以在閱讀本章中的可搜尋加密概念時，使用此範例做為參考。

考慮名為 的資料庫`Employees`，可追蹤公司的員工資料。資料庫中的每個記錄都包含稱為 *EmployeeID*、*LastName*、*FirstName* 和 *Address* 的欄位。`Employees` 資料庫中的每個欄位都由主索引鍵 識別`EmployeeID`。

以下是資料庫中的純文字記錄範例。

```
{
    "EmployeeID": 101,
    "LastName": "Jones",
    "FirstName": "Mary",
    "Address": {
                "Street": "123 Main",
                "City": "Anytown",
                "State": "OH",
                "ZIPCode": 12345
    }
}
```

如果您在[密碼編譯動作](concepts.md#crypt-actions)`ENCRYPT_AND_SIGN`中將 `LastName`和 `FirstName` 欄位標記為 ，則這些欄位中的值會在上傳至資料庫之前在本機加密。上傳的加密資料是完全隨機的，資料庫無法將此資料辨識為受保護。它只會偵測典型的資料項目。這表示實際存放在資料庫中的記錄可能如下所示。

```
{
    "PersonID": 101,
    "LastName": "1d76e94a2063578637d51371b363c9682bad926cbd",
    "FirstName": "21d6d54b0aaabc411e9f9b34b6d53aa4ef3b0a35",
    "Address": {
                "Street": "123 Main",
                "City": "Anytown",
                "State": "OH",
                "ZIPCode": 12345
    }
}
```

如果您需要在 `LastName` 欄位中查詢資料庫的完全相符項目，[請設定名為 LastName 的標準信標](configure-beacons.md#config-standard-beacons)，將寫入`LastName`欄位的純文字值映射至資料庫中存放的加密值。 *LastName* 

此信標會從 `LastName` 欄位中的純文字值計算 HMACs。每個 HMAC 輸出都會截斷，使其不再完全符合純文字值。例如， 的完整雜湊和截斷的雜湊`Jones`可能如下所示。

**完成雜湊**

`2aa4e9b404c68182562b6ec761fcca5306de527826a69468885e59dc36d0c3f824bdd44cab45526f70a2a18322000264f5451acf75f9f817e2b35099d408c833`

**截斷的雜湊**

`b35099d408c833`

設定標準信標之後，您可以在 `LastName` 欄位上執行相等性搜尋。例如，如果您想要搜尋 `Jones`，請使用 *LastName* 信標來執行下列查詢。

```
LastName = Jones
```

 AWS Database Encryption SDK 會自動篩選掉誤報，並傳回查詢的純文字結果。