

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

# 步骤 4：为表格文件生成加密架构
<a name="gen-encryption-schema-csv"></a>

要加密数据，需要一个描述如何使用数据的加密架构。本节介绍 C3R 加密客户端如何帮助为带有标题行的 CSV 文件或 Parquet 文件生成加密架构。

每个文件只需进行一次该操作。架构存在后，可以重复使用它来加密同一个文件（或任何具有相同列名的文件）。如果列名或所需的加密架构发生变化，则必须更新架构文件。有关更多信息，请参阅 [（可选）创建架构（高级用户）](create-schema.md)。

**重要**  
所有协作方都必须使用相同的共享密钥。如果要在查询中对列名进行 JOIN 或以其他方式比较列名是否相等，各协作方还应协调列名，使其相匹配。否则，SQL 查询可能会产生意外或不正确的结果。但是，如果协作创建者在创建协作期间启用了 `allowJoinsOnColumnsWithDifferentNames` 加密设置，则无需这样做。有关加密相关设置的更多信息，请参阅[加密计算参数](crypto-computing-parameters.md)。

在架构模式下运行时，C3R 加密客户端会逐列浏览输入文件，提示您是否以及如何处理该列。如果文件中包含许多加密输出不需要的列，交互式模式生成可能会变得繁琐，因为您必须跳过每个不需要的列。为避免这种情况，您可以手动编写架构，或者创建仅包含所需列的输入文件的简化版本。然后，可以在该简化的文件上运行交互式架构生成器。C3R 加密客户端会输出有关架构文件的信息，并询问您应如何在目标输出中包含或加密源列（如果有）。

对于输入文件中的每个源列，系统会提示：

1. 应该生成多少个目标列

1. 应如何加密每个目标列（如果有）

1. 每个目标列的名称

1. 如果将列作为 sealed 列进行加密，在加密之前应如何填充数据。

**注意**  
对已加密为 sealed 列的列的数据进行加密时，必须确定哪些数据需要填充。C3R 加密客户端建议在架构生成期间使用默认填充，将列中的所有条目填充到相同的长度。  
在确定 `fixed` 的长度时，请注意填充以字节为单位，而不是以位为单位。

以下是创建架构的决定表。


**架构决定表**  

| 决策 | 源列中的目标列数 <' name-of-column '>？ | 目标列类型：[c] cleartext、[f] fingerprint 或 [s] sealed？ | 目标列标题名称 <default 'name-of-column'> | 在标题中添加 <suffix> 后缀以指示它是如何加密的，[y] 是或 [n] 否 <default 'yes'> | <' name-of-column \$1sealed'> 填充类型：[n] 一、[f] 固定或 [m] 最大 <default 'max'> | 
| --- | --- | --- | --- | --- | --- | 
| 保持列未加密。 | 1 | c | 不适用 | 不适用 | 不适用 | 
| 将列加密为 fingerprint 列。 | 1 | f | 选择默认值或输入新的标题名称。 | 输入 y 选择默认值 (\$1fingerprint) 或输入 n。 | 不适用 | 
| 将列加密为 sealed 列。 | 1 | s | 选择默认值或输入新的标题名称。 | 输入 y 选择默认值 (\$1sealed) 或输入 n。 |  选择填充类型。 有关更多信息，请参阅 [（可选）创建架构（高级用户）](create-schema.md)。  | 
| 将列同时加密为 fingerprint 和 sealed。 | 2 |  输入第一个目标列：**f**。 输入第二个目标列：**s**。  | 为每个目标列选择目标标题。 | 输入 y 选择默认值或输入 n. |  选择填充类型（仅适用于 sealed 列）。 有关更多信息，请参阅 [（可选）创建架构（高级用户）](create-schema.md)。  | 

以下是如何创建加密架构的两个示例。交互的具体内容取决于输入文件和您提供的响应。

**Topics**
+ [

## 示例：为 fingerprint 列和 cleartext 列生成加密架构
](#gen-encryption-schema_join)
+ [

## 示例：生成带有 sealed、fingerprint 和 cleartext 列的加密架构
](#gen-encryption-schema)

## 示例：为 fingerprint 列和 cleartext 列生成加密架构
<a name="gen-encryption-schema_join"></a>

在此示例中，对于 `ads.csv`，只有两列：`username` 和 `ad_variant`。对于这些列，我们需要以下内容：
+ 将 `username` 列加密为 `fingerprint` 列
+ 将 `ad_variant` 列加密为 `cleartext` 列

**为 fingerprint 列和 cleartext 列生成加密架构**

1. （*可选*）要确保 c3r-cli.jar 文件和要加密的文件存在，请执行以下操作：

   1. 导航到所需的目录并运行 `ls`（如果使用 Mac 或 Unix/Linux）或 `dir`（如果使用 Windows）。

   1. 查看表格数据文件（例如 .csv）列表，然后选择要加密的文件。

      在此示例中，`ads.csv` 是我们要加密的文件。

1. 在 CLI 中，运行以下命令以交互方式创建架构。

   `java -jar c3r-cli.jar schema ads.csv --interactive --output=ads.json`
**注意**  
您可以运行 `java --jar PATH/TO/c3r-cli.jar`。或者，如果您已将 `PATH/TO/c3r-cli.jar` 添加到 CLASSPATH 环境变量中，也可以运行该类名。C3R 加密客户端将在 CLASSPATH 中查找以找到它（例如 `java com.amazon.psion.cli.Main`）。
`--interactive` 标志选择开发架构的交互模式。这将引导用户完成创建架构的向导。具有高级技能的用户无需使用向导即可创建自己的架构 JSON。有关更多信息，请参阅 [（可选）创建架构（高级用户）](create-schema.md)。
`--output` 标志设置输出名称。如果不包含 `--output` 标志，则 C3R 加密客户端会尝试选择默认输出名称（例如 `<input>.out.csv` 或架构的 `<input>.json`）。

1. 对于 `Number of target columns from source column ‘username’?`，输入 **1**，然后按 **Enter**。

1. 对于 `Target column type: [c]leartext, [f]ingerprint, or [s]ealed?`，输入 **f**，然后按 **Enter**。

1. 对于 `Target column headername <default 'username'>`，按 **Enter**。

   默认名称为“`username`”。

1. 对于 `Add suffix '_fingerprint' to header to indicate how it was encrypted, [y]es or [n]o <default 'yes'>`，输入 **y**，然后按 **Enter**。
**注意**  
交互模式建议在加密的列标题中添加的后缀（fingerprint 列添加 `_fingerprint`，sealed 列添加 `_sealed`）。当您执行诸如将数据上传到 AWS 服务 或创建 AWS Clean Rooms 协作之类的任务时，后缀可能会有所帮助。这些后缀可以帮助指示对每列中的加密数据可以做些什么。例如，如果您将列加密为 sealed 列 (`_sealed`) 并尝试对其进行 JOIN 或尝试反向操作，则会出现问题。

1. 对于 `Number of target columns from source column ‘ad_variant’?`，输入 **1**，然后按 **Enter**。

1. 对于 `Target column type: [c]leartext, [f]ingerprint, or [s]ealed?`，输入 **c**，然后按 **Enter**。

1. 对于 `Target column headername <default 'username'>`，按 **Enter**。

   默认名称为“`ad_variant`”。

   架构被写入名为 `ads.json` 的新文件。
**注意**  
您可以通过在任何文本编辑器（例如 Windows 上的 Notepad 或 macOS 上的 TextEdit）中打开架构来查看架构。

1. 现在，您可以[加密数据](encrypt-data.md)了。

## 示例：生成带有 sealed、fingerprint 和 cleartext 列的加密架构
<a name="gen-encryption-schema"></a>

在此示例中，对于 `sales.csv`，有三列：`username`、`purchased` 和 `product`。对于这些列，我们需要以下内容：
+ 将 `product` 列加密为 `sealed` 列
+ 将 `username` 列加密为 `fingerprint` 列
+ 将 `purchased` 列加密为 `cleartext` 列

**生成带有 sealed、fingerprint 和 cleartext 列的加密架构**

1. （*可选*）要确保 c3r-cli.jar 文件和要加密的文件存在，请执行以下操作：

   1. 导航到所需的目录并运行 `ls`（如果使用 Mac 或 Unix/Linux）或 `dir`（如果使用 Windows）。

   1. 查看表格数据文件 (.csv) 列表并选择要加密的文件。

      在此示例中，`sales.csv` 是我们要加密的文件。

1. 在 CLI 中，运行以下命令以交互方式创建架构。

   `java -jar c3r-cli.jar schema sales.csv --interactive --output=sales.json`
**注意**  
`--interactive` 标志选择开发架构的交互模式。这将引导用户完成创建架构的指导性工作流程。
如果您是高级用户，则无需使用指导性工作流程即可创建自己的架构 JSON。有关更多信息，请参阅 [（可选）创建架构（高级用户）](create-schema.md)。
对于没有列标题的 .csv 文件，请参阅 CLI 中可用的架构命令的 `--noHeaders` 标志。
`--output` 标志设置输出名称。如果不包含 `--output` 标志，则 C3R 加密客户端会尝试选择默认输出名称（例如 `<input>.out` 或架构的 `<input>.json`）。

1. 对于 `Number of target columns from source column ‘username’?`，输入 **1**，然后按 **Enter**。

1. 对于 `Target column type: [c]leartext, [f]ingerprint, or [s]ealed?`，输入 **f**，然后按 **Enter**。

1. 对于 `Target column headername <default 'username'>`，按 **Enter**。

   默认名称为“`username`”。

1. 对于 `Add suffix '_fingerprint' to header to indicate how it was encrypted, [y]es or [n]o <default 'yes'>`，输入 **y**，然后按 **Enter**。

1. 对于 `Number of target columns from source column ‘purchased’?`，输入 **1**，然后按 **Enter**。

1. 对于 `Target column type: [c]leartext, [f]ingerprint, or [s]ealed?`，输入 **c**，然后按 **Enter**。

1. 对于 `Target column headername <default 'purchased'>`，按 **Enter**。

   默认名称为“`purchased`”。

1. 对于 `Number of target columns from source column ‘product’?`，输入 **1**，然后按 **Enter**。

1. 对于 `Target column type: [c]leartext, [f]ingerprint, or [s]ealed?`，输入 **s**，然后按 **Enter**。

1. 对于 `Target column headername <default 'product'>`，按 **Enter**。

   默认名称为“`product`”。

1. 对于 `‘product_sealed’ padding type: [n]one, [f]ixed, or [m]ax <default ’max’?>`，按 **Enter** 选择默认值。

1. 对于 `Byte-length beyond max length to pad cleartext to in ‘product_sealed’ <default ‘0’>?`，按 **Enter** 选择默认值。

   架构被写入名为 `sales.json` 的新文件。

1. 现在，您可以[加密数据](encrypt-data.md)了。