

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Clean Rooms 加密计算时的注意事项
<a name="crypto-computing-considerations"></a>

Clean Rooms 加密计算 (C3R) 旨在最大限度地保护数据。但是，某些使用案例可能会受益于较低级别的数据保护，以换取额外的功能。您可以通过修改 C3R 最安全的配置来做出这些特定的权衡。作为客户，您应该了解这些权衡，并确定它们是否适合您的使用案例。要考虑的权衡包括以下内容：

**Topics**
+ [允许在表中混合 cleartext 和加密数据](#allow-mixed-plaintext-and-encrypted-data)
+ [允许 fingerprint 列中有重复值](#allow-repeated-values)
+ [放宽对 fingerprint 列命名方式的限制](#loose-restrictions-on-join-column-names)
+ [确定 NULL 值的表示方式](#determine-null-values)

有关如何为这些场景设置参数的更多信息，请参阅[加密计算参数](crypto-computing-parameters.md)。

## 允许在表中混合 cleartext 和加密数据
<a name="allow-mixed-plaintext-and-encrypted-data"></a>

对所有数据进行客户端加密可最大限度地保护数据。但是，这限制了某些类型的查询（例如，SUM 聚合函数）。允许 cleartext 数据的风险在于，任何有权访问加密表的人都可以推断出一些有关加密值的信息。这可以通过对 cleartext 和关联数据进行统计分析来实现。

例如，假设您的列为 `City` 和 `State`。`City` 列为 cleartext，`State` 列加密。当您看到 `City` 列中的 `Chicago` 值时，这有助于您确定 `State` 很有可能是 `Illinois`。相比之下，如果一列是 `City`，另一列是 `EmailAddress`，则 cleartext `City` 不太可能揭示加密 `EmailAddress` 的任何信息。

有关此场景的参数的更多信息，请参阅[允许 cleartext 列参数](crypto-computing-parameters.md#parameter-allowcleartext)。

## 允许 fingerprint 列中有重复值
<a name="allow-repeated-values"></a>

对于最安全的方法，我们假设任何 fingerprint 列都只包含一个变量实例。fingerprint 列中的任何项目都不能重复。C3R 加密客户端将这些 cleartext 值映射为与随机值无法区分的唯一值。因此，不可能从这些随机值中推断出 cleartext 信息。

fingerprint 列中有重复值的风险在于，重复的值会导致重复的随机值。因此，从理论上讲，任何有权访问加密表的人都可以对可能揭示 cleartext 值信息的 fingerprint 列进行统计分析。

同样，假设 fingerprint 列是 `State`，并且表中的每一行都对应一个美国家庭。通过频率分析，人们很有可能推断出哪个州是 `California`，哪个州是 `Wyoming`。这种推断是可能的，因为 `California` 的居民人数远远超过 `Wyoming`。相比之下，假设 fingerprint 列位于家庭标识符上，在包含数百万个条目的数据库中，每个家庭出现 1 到 4 次。频率分析不太可能揭示任何有用的信息。

有关此场景的参数的更多信息，请参阅[“允许重复”参数](crypto-computing-parameters.md#parameter-allowduplicates)。

## 放宽对 fingerprint 列命名方式的限制
<a name="loose-restrictions-on-join-column-names"></a>

默认情况下，我们假设当使用加密 fingerprint 列联接两个表时，这些列在每个表中的名称相同。此结果的技术原因是，默认情况下，我们派生出不同的加密密钥来加密每个 fingerprint 列。该密钥源自协作共享密钥和列名的组合。如果我们尝试联接具有不同列名的两列，则会派生出不同的密钥，并且无法计算出有效的联接。

要解决这个问题，可以关闭从每个列名派生密钥的功能。然后，C3R 加密客户端对所有 fingerprint 列使用一个派生密钥。风险在于可以进行另一种可能揭示信息的频率分析。

让我们再次以 `City` 和 `State` 为例。如果我们为每个 fingerprint 列派生相同的随机值（不包含列名）。`New York` 在 `City` 和 `State` 列中的随机值相同。纽约是美国为数不多的 `City` 名称与 `State` 名称相同的城市之一。相比之下，如果数据集的每一列都有完全不同的值，则不会泄露任何信息。

有关此场景的参数的更多信息，请参阅[“允许对具有不同名称的列进行 JOIN”参数](crypto-computing-parameters.md#parameter-allowjoin)。

## 确定 NULL 值的表示方式
<a name="determine-null-values"></a>

您可以选择是否像处理其他值一样对 NULL 值进行加密处理（加密和 HMAC）。如果您不像处理其他值一样处理 NULL 值，可能会揭示信息。

例如，假设 cleartext 中 `Middle Name` 列中的 NULL 表示没有中间名的人。如果您不加密这些值，则会泄露加密表中哪些行用于没有中间名的人。对于某些人群中的某些人来说，这些信息可能是一个识别信号。但是，如果您对 NULL 值进行加密处理，某些 SQL 查询的行为就会有所不同。例如，GROUP BY 子句不会将 fingerprint 列中的 fingerprintNULL 值分组在一起。

有关此场景的参数的更多信息，请参阅[“保留 NULL 值”参数](crypto-computing-parameters.md#parameter-preservenulls)。