

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

# AWS Clean Rooms 差异隐私
<a name="differential-privacy"></a>

AWS Clean Rooms 差异隐私通过一种以数学为依据的技术帮助您保护用户的隐私，该技术只需单击几下即可通过直观的控件实现。作为一项完全托管的功能，无需事先体验差异化隐私即可帮助您防止重新识别用户。 AWS Clean Rooms 在运行时自动向查询结果添加经过精心校准的噪音量，以帮助保护您的个人级别数据。

AWS Clean Rooms Difersition Privacy 支持广泛的分析查询，非常适合各种用例，在这些用例中，查询结果中的少量错误不会影响分析的实用性。通过使用该功能，您的合作伙伴可以生成有关广告活动、投资决策、临床研究等的业务关键型见解，合作伙伴无需进行任何额外的设置。

AWS Clean Rooms 差异隐私可防止恶意使用标量函数或数学运算符符号的溢出或无效强制转换错误。

有关 AWS Clean Rooms 差分隐私的更多信息，请参阅以下主题。

**Topics**
+ [差异隐私](#dp-overview)
+ [差分隐私是如何 AWS Clean Rooms 运作的](#dp-how-it-works)
+ [差别隐私策略](dp-settings.md)
+ [AWS Clean Rooms 差异隐私的 SQL 功能](dp-sql-capabilities.md)
+ [Differential Privacy 查询技巧和示例](dp-query-tips-examples.md)
+ [AWS Clean Rooms 差异隐私的局限性](dp-limitations.md)

## 差异隐私
<a name="dp-overview"></a>

差别隐私仅允许聚合的见解，并掩盖任何个人数据在这些见解中的贡献。差别隐私保护协作数据，以防止可以接收结果的成员了解特定个人的数据。如果没有差别隐私，可以接收结果的成员可能会尝试添加或删除有关个人的记录，并观察查询结果差异以推断个人用户数据。

在开启差别隐私后，将在查询结果中添加指定数量的噪声以掩盖各个用户的贡献。如果能够接收结果的成员在从其数据集中删除有关个人的记录后试图观察查询结果的差异，则查询结果的可变性有助于阻止识别该个人的数据。 AWS Clean Rooms Difersial Privacy 使用[SampCert](https://github.com/leanprover/SampCert)采样器，这是由开发的经过验证的正确采样器实现。 AWS

## 差分隐私是如何 AWS Clean Rooms 运作的
<a name="dp-how-it-works"></a>

在[完成以下工作流程时，开启差异隐私的工作流程 AWS Clean Rooms](what-is.md#how-it-works)需要执行以下额外步骤 AWS Clean Rooms：

1. 在添加[自定义分析规则](analysis-rules-custom.md)时，您可以开启差别隐私。

1. [您为协作配置差别隐私策略](configure-differential-privacy.md)，以使受差别隐私保护的数据表可供查询。

完成这些步骤后，可以查询的成员可以开始对受差异隐私保护的数据进行查询。 AWS Clean Rooms 返回符合差异隐私政策的结果。 AWS Clean Rooms Differation Privacy 会跟踪您可以运行的剩余查询的估计数量，类似于显示汽车当前燃油水平的汽车中的汽油表。可以查询的成员可以运行的查询数量受[差别隐私策略](dp-settings.md)中设置的**隐私预算**和**每个查询添加的噪声**参数的限制。

### 注意事项
<a name="dp-considerations"></a>

在中使用差分隐私时 AWS Clean Rooms，请考虑以下几点：
+ 可以接收结果的成员无法使用差别隐私。他们将为配置的表配置自定义分析规则，并关闭差别隐私。
+ 如果两个或更多数据提供者都开启了差别隐私，可以查询的成员无法联接来自这些数据提供者的表。

# 差别隐私策略
<a name="dp-settings"></a>

差别隐私策略控制允许可以查询的成员在协作中运行多少个聚合函数。**隐私预算**定义一种通用的有限资源，该资源应用于协作中的所有表。**每个查询添加的噪声**控制隐私预算的耗尽速率。

需要具有差别隐私策略，才能使受差别隐私保护的表可供查询。这是协作中的一次性步骤，其中包括两个输入：
+ **隐私预算** - 以 epsilon 量化，隐私预算控制隐私保护级别。这是一种通用的有限资源，应用于协作中受差别隐私保护的所有表，因为目标是保护可能在多个表中包含信息的用户的隐私。

  每次对表运行查询时，都会使用**隐私预算**。在隐私预算用完时，可以查询的协作成员无法运行额外的查询，直到增加或刷新隐私预算。通过设置较大的隐私预算，可以接收结果的成员可以减少他们对数据中的个人的不确定性。在咨询业务决策者后，选择一个兼顾您的协作要求和隐私需求的隐私预算。

  如果您计划定期将新数据引入到一个协作中，您可以选择**每月刷新隐私预算**，以在每个日历月自动创建新的隐私预算。如果选择该选项，在两次刷新之间重复查询时，可能会泄露任意数量的数据行相关信息。如果在隐私预算刷新之间重复查询相同的行，请避免选择该选项。
+ **每个查询添加的噪声**是根据您希望掩盖其贡献的用户数量测量的。该值控制隐私预算的耗尽速率。较大的噪声值降低隐私预算的耗尽速率，因此，允许对数据运行更多查询。不过，这会导致发布的数据见解不太准确。在设置该值时，请考虑协作见解所需的准确性。

您可以使用默认的差异隐私策略来快速完成设置或根据您的用例自定义差异隐私政策。 AWS Clean Rooms 差异隐私提供了用于配置策略的直观控件。 AWS Clean Rooms Difersition Privacy 允许您根据数据的所有查询中可能的聚合数量来预览该实用程序，并估算在数据协作中可以运行多少查询。

您可以使用交互式示例，以了解**隐私预算**和**每个查询添加的噪声**的不同值如何影响不同类型的 SQL 查询的结果。一般来说，您需要兼顾隐私需求以及要允许的查询数量和这些查询的准确性。较小的**隐私预算**或较大的**每个查询添加的噪声**可以更好地保护用户隐私，但为协作合作伙伴提供不太有意义的见解。

如果您增加**隐私预算**，同时将**每个查询添加的噪声**参数保持不变，则可以查询的成员可以在协作中对您的表运行更多的聚合。您可以在协作期间随时增加**隐私预算**。如果您减少**隐私预算**，同时将**每个查询添加的噪声**参数保持不变，则可以查询的成员可以运行更少的聚合。在可以查询的成员开始分析您的数据后，您无法减少**隐私预算**。

如果您增加**每个查询添加的噪声**，同时将**隐私预算**输入保持不变，则可以查询的成员可以在协作中对您的表运行更多的聚合。如果您减少**每个查询添加的噪声**，同时将**隐私预算**输入保持不变，则可以查询的成员可以运行更少的聚合。您可以在协作期间随时增加或减少**每个查询添加的噪声**。

差别隐私策略是通过隐私预算模板 API 操作管理的。

# AWS Clean Rooms 差异隐私的 SQL 功能
<a name="dp-sql-capabilities"></a>

AWS Clean Rooms 差异隐私使用通用查询结构来支持复杂的 SQL 查询。根据此结构对自定义分析模板进行验证，以确保它们可以在受差别隐私保护的表上运行。下表指示支持哪些函数。请参阅[查询结构和语法](analysis-rules-custom.md#dp-query-structure-syntax)了解更多信息。


| 类别 | Spark 分析引擎支持的 SQL 结构 | 常用表表达式 (CTEs) | 最终 SELECT 子句 | 
| --- |--- |--- |--- |
| 聚合函数 |    ANY\$1VALUE 函数   APPROXIMATE PERCENTILE\$1DISC 函数   AVG 函数   COUNT 和 COUNT DISTINCT 函数   MAX 函数   MEDIAN 函数   MIN 函数   PERCENTILE\$1CONT 函数   STDDEV\$1SAMP 和 STDDEV\$1POP 函数   SUM 和 SUM DISTINCT 函数   VAR\$1SAMP 和 VAR\$1POP 函数    | 支持这样的条件： CTEs 使用受差异隐私保护的表必须生成具有用户级记录的数据。您应该 CTEs 使用`SELECT userIdentifierColumn...'格式编写 SELECT 表达式。 | 支持的聚合：AVG、COUNT、COUNT DISTINCT、STDDEV 和 SUM。 | 
| CTEs | WITH 子句、WITH 子句子查询 | 支持这样的条件： CTEs 使用受差异隐私保护的表必须生成具有用户级记录的数据。您应该 CTEs 使用`SELECT userIdentifierColumn...'格式编写 SELECT 表达式。 | 不适用 | 
| 子查询 |    SELECT   HAVING   JOIN   JOIN 条件   FROM   WHERE    | 在这些结构中，你可以有任何不引用差异隐私关系的子查询。您只能在 FROM 和 JOIN 子句中使用任何引用差异隐私关系的子查询。 | 
| 联接条款 |    INNER JOIN   LEFT JOIN   左半连接   左边反连接   RIGHT JOIN   FULL JOIN   [JOIN] OR 运算符   CROSS JOIN    |  支持的条件是，仅支持对用户标识符列进行等值联接的 JOIN 函数；在查询两个或更多开启了差别隐私的表时，必须使用这些函数。确保必需的等值联接条件是正确的。确认表所有者在所有表中配置了相同的用户标识符列，以便用户的定义在表之间保持一致。 在合并两个或更多开启了差别隐私的关系时，不支持 CROSS JOIN 函数。  | 
| 集合运算符 | UNION、UNION ALL、INTERSECT、除外 \$1 减号（这些是同义词） | UNION、UNION ALL、INTERSECT、除外 \$1 减号（这些是同义词） | 不支持 | 
| 窗口函数 |  聚合函数   AVG 窗口函数   COUNT 窗口函数   CUME\$1DIST 开窗函数   DENSE\$1RANK 窗口函数   FIRST\$1VALUE 窗口函数   LAG 窗口函数   LAST\$1VALUE 窗口函数   LEAD 窗口函数   MAX 窗口函数   MEDIAN 窗口函数   MIN 窗口函数   NTH\$1VALUE 窗口函数   STDDEV\$1SAMP 和 STDDEV\$1POP 窗口函数（STDDEV\$1SAMP 和 STDDEV 是同义词）   SUM 窗口函数   VAR\$1SAMP 和 VAR\$1POP 窗口函数（VAR\$1SAMP 和 VARIANCE 是同义词）   排名函数   DENSE\$1RANK 窗口函数   NTILE 窗口函数   PERCENT\$1RANK 开窗函数   RANK 窗口函数   ROW\$1NUMBER 窗口函数    | 在查询开启差异隐私的关系时，窗口函数的分区子句中的用户标识符列是必填的，条件是所有这些都支持。 | 不支持 | 
| 条件表达式 |    CASE 条件表达式   COALESCE 表达式   GREATEST 和 LEAST 函数   NVL 和 COALESCE 函数   NVL2 函数   NULLIF 函数    | 全部支持 | 全部支持 | 
| Conditions |    比较条件   逻辑条件   模式匹配条件   BETWEEN 范围条件   Null 条件    | EXISTS并且IN无法使用，因为它们需要子查询。支持所有其他内容。 | 全部支持 | 
| 日期时间函数 |    事务中的日期和时间函数   串联运算符   ADD\$1MONTHS 函数   CONVERT\$1TIMEZONE 函数   CURRENT\$1DATE 函数   DATEADD 函数   DATEDIFF 函数   DATE\$1PART 函数   DATE\$1TRUNC 函数   EXTRACT 函数   TO\$1TIMESTAMP 函数   日期或时间戳函数的日期部分    | 全部支持 | 全部支持 | 
| 字符串函数 |    \$1\$1（串联）运算符   BTRIM 函数   CHAR\$1LENGTH 函数   CHARACTER\$1LENGTH 函数   CONCAT 函数   LEFT 和 RIGHT 函数   LEN 函数   LENGTH 函数   LOWER 函数   LPAD 和 RPAD 函数   LTRIM 函数   POSITION 函数   REGEXP\$1COUNT 函数   REGEXP\$1INSTR 函数   REGEXP\$1REPLACE 函数   REGEXP\$1SUBSTR 函数   REPEAT 函数   REPLACE 函数   REVERSE 函数   RTRIM 函数   SPLIT\$1PART 函数   SUBSTRING 函数   TRANSLATE 函数   TRIM 函数   UPPER 函数    | 全部支持 | 全部支持 | 
| 数据类型格式设置函数 |    CAST 函数   TO\$1CHAR   TO\$1DATE 函数   TO\$1NUMBER   日期时间格式字符串   数字格式字符串    | 全部支持 | 全部支持 | 
| 哈希函数 |    AES\$1加密   AES\$1DECRYPT   ENCODE   DECODE   MD5 函数   SHA1 函数   SHA2 函数   XX\$1 HASH64    | 全部支持 | 全部支持 | 
| 数学运算符符号 | \$1、-、\$1、/、% 和 @ | 全部支持 | 全部支持 | 
| 数学函数 |    ABS 函数   ACOS 函数   ASIN 函数   ATAN 函数   ATAN2 函数   CBRT 函数   CEILING（或 CEIL）函数   COS 函数   COT 函数   DEGREES 函数   LTRIM 函数   EXP 函数   FLOOR 函数   LN 函数   LOG 函数   MOD 函数   PI 函数   POWER 函数   RADIANS 函数   RANDOM 函数   ROUND 函数   SIGN 函数   SIN 函数   SQRT 函数   TRUNC 函数    | 全部支持 | 全部支持 | 
| VARBYTE 函数 |    UNHEX，   UNBASE64   十六进制    HLL\$1SKETCH\$1AGG，    HLL\$1SKETCH\$1ESTIMATE   HLL\$1UNION   HLL\$1UNION\$1AGG    | 全部支持 | 全部支持 | 
| JSON |    TO\$1JSON   GET\$1JSON\$1OBJECT    | 全部支持 | 全部支持 | 
| 数组函数 |    数组\$1包含   数组\$1不同   数组\$1除外   数组\$1相交   ARRAY\$1JOIN   数组\$1删除   数组\$1排序   ARRAY\$1UNION    | 不支持 | 不支持 | 
| 扩展分组依据 | 分组集、汇总、立方体 | 不支持 | 不支持 | 
| 排序操作 | ORDER BY | 支持 ORDER BY 子句，条件是只有在开启差分隐私的情况下查询表时，窗口函数的分区子句才支持 ORDER BY 子句。 | 支持 | 
| 行数限制 | LIMIT、OFFSET | 不支持 CTEs 使用受差异隐私保护的表 | 全部支持 | 
| 表和列别名 |   | 支持 | 支持 | 
| 聚合函数上的数学函数 |   | 支持 | 支持 | 
| 聚合函数中的标量函数 |   | 支持 | 支持 | 

## 不支持的 SQL 构造的常见替代方案
<a name="common-alternatives"></a>


| 类别 | SQL 构造 | 或者 | 
| --- |--- |--- |
|  窗口函数  |    LISTAGG   PERCENTILE\$1CONT   PERCENTILE\$1DISC    | 您可以将等效的聚合函数与 GROUP BY 一起使用。 | 
| 数学运算符符号 |    \$1column \$1\$1/ 2   \$1column \$1/ 2   \$1column ^ 2    |    CBRT   SQRT   POWER(\$1column, 2)    | 
| 标量函数 |    SYSDATE   \$1column::integer   convert(type, \$1column)    |    CURRENT\$1DATE   CAST \$1column AS integer   CAST \$1column AS type    | 
| 文本 | 间隔 '1 秒' | 间隔 '1' 秒 | 
| 行限制 | TOP n | 限制 n | 
| 联接 |    USING   NATURAL    | ON 子句应明确包含连接标准。 | 

# Differential Privacy 查询技巧和示例
<a name="dp-query-tips-examples"></a>

AWS Clean Rooms 差异隐私使用[通用查询结构](dp-sql-capabilities.md)来支持各种 SQL 结构，例如用于数据准备的公用表表达式 (CTEs) 和常用的聚合函数`COUNT`，例如、或。`SUM`为了通过在运行时向聚合查询结果添加噪音来混淆任何可能的用户在数据中的贡献，Difersient Privacy 要求最终`SELECT statement`版本中的聚合函数在用户级数据上运行。 AWS Clean Rooms 

以下示例使用来自一个媒体发布者的两个名为 `socialco_impressions` 和 `socialco_users` 的表，该发布者希望使用差别隐私保护数据，同时与一个具有 `athletic_brand_sales` 数据的运动品牌协作。该媒体发布者已将 `user_id` 列配置为用户标识符列，同时在 AWS Clean Rooms中启用差别隐私。广告商不需要差异隐私保护，而是希望使用组合数据 CTEs 进行查询。由于他们的 CTE 使用受差别隐私保护的表，因此，广告商将这些受保护的表中的用户标识符列包含在 CTE 列的列表中，并根据用户标识符列联接这些受保护的表。

```
WITH matches_table AS(
     SELECT si.user_id, si.campaign_id, s.sale_id, s.sale_price
     FROM socialco_impressions si
     JOIN socialco_users su
         ON su.user_id = si.user_id
     JOIN athletic_brand_sales s
         ON s.emailsha256 = su.emailsha256
     WHERE s.timestamp > si.timestamp
    
UNION ALL
 
     SELECT si.user_id, si.campaign_id, s.sale_id, s.sale_price
     FROM socialco_impressions si
     JOIN socialco_users su
         ON su.user_id = si.user_id
     JOIN athletic_brand_sales s
         ON s.phonesha256 = su.phonesha256
     WHERE s.timestamp > si.timestamp
)
        
SELECT COUNT (DISTINCT user_id) as unique_users
FROM matches_table
GROUP BY campaign_id
ORDER BY COUNT (DISTINCT user_id) DESC
LIMIT 5
```

同样，如果要对受差别隐私保护的数据表运行窗口函数，您必须在 `PARTITION BY` 子句中包含用户标识符列。

```
ROW_NUMBER() OVER (PARTITION BY conversion_id, user_id ORDER BY match_type, match_age) AS row
```

# AWS Clean Rooms 差异隐私的局限性
<a name="dp-limitations"></a>

AWS Clean Rooms 差异隐私不能解决以下情况：

1. AWS Clean Rooms 差异隐私仅支持使用 Amazon S3 支持的 AWS Glue 表进行查询。它不支持使用 Snowflake 或 Amazon Athena 表进行查询。

1. AWS Clean Rooms 差异隐私无法解决定时攻击。例如，如果单个用户贡献大量的行，并且添加或删除该用户显著改变查询计算时间，则可能会受到这些攻击。

1. AWS Clean Rooms 当 SQL 查询可能由于使用某些 SQL 结构而在运行时导致溢出或无效的强制转换错误时，差异隐私不能保证差异隐私。

   下表列出了一些（但不是全部）可能会产生运行时错误而应当在分析模板中进行验证的 SQL 构造。我们建议您批准能够最大限度地减少出现此类运行时错误次数的分析模板，并定期查看查询日志，确定查询是否符合协作协议。

   以下 SQL 构造容易出现溢出错误：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/clean-rooms/latest/userguide/dp-limitations.html)

1. CAST 数据类型格式化函数容易出现无效的强制转换错误。

   您可以配置[CloudWatch 为为日志组创建指标筛选器](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CreateMetricFilterProcedure.html)，然后在该指标筛选器上[创建 CloudWatch 警](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Alarm-On-Logs.html)报，以便在遇到潜在的溢出或投射错误时接收警报。

   具体而言，您应该关注错误代码 `CastError`、`OverflowError`、`ConversionError`。存在这些错误代码表示可能存在侧信道攻击，但也可能表示存在错误的 SQL 查询。

   有关更多信息，请参阅 [分析登录 AWS Clean Rooms](query-logs.md)。