

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# (オプション) スキーマの作成 (上級ユーザー)
<a name="create-schema"></a>

スキーマの手動作成は、上級ユーザーを対象としています。

以下のセクションでは、列ヘッダーがある場合とない場合の、入力ファイルの JSON スキーマファイル形式について説明しています。上級ユーザーは、必要に応じてスキーマを直接記述または変更できます。

**注記**  
C3R 暗号化クライアントでは、「[例:sealed、fingerprint、およびcleartext列を含む暗号化スキーマの生成](gen-encryption-schema-csv.md#gen-encryption-schema)」で説明されているインタラクティブなプロセス、またはスタブテンプレートの作成のいずれかを通じてスキーマを作成できます。

## マッピングテーブルスキーマと位置テーブルスキーマ
<a name="mapped-and-positional-schemas"></a>

次のセクションでは、2 種類のテーブルスキーマについて説明します。
+ **マッピングテーブルスキーマ** – このスキーマは、ヘッダー行を含む .csv ファイルと Apache Parquet ファイルの暗号化に使用されます。
+ **位置テーブルスキーマ** – このスキーマは、ヘッダー行のない .csv ファイルの暗号化に使用されます。

C3R 暗号化クライアントでは、コラボレーション用の表形式ファイルを暗号化できます。それには、入力から暗号化された出力をどのように導き出すかを指定するための、対応するスキーマファイルが必要です。

C3R 暗号化クライアントでは、コマンドラインで C3R 暗号化クライアントのスキーマコマンドを実行することで、`INPUT` ファイルのスキーマを生成できます。`java -jar c3r-cli.jar schema --interactive INPUT` はコマンドの一例です。

スキーマでは、以下の情報を指定します。

1. ヘッダー名 (マッピングスキーマ) または位置 (位置スキーマ) によって、どのソース列が出力ファイルのどの変換後の列にマッピングされるか

1. どのターゲット列をcleartextのまま残すか

1. SELECT クエリのためにどのターゲット列を暗号化するか

1. JOIN クエリのためにどのターゲット列を暗号化するか

この情報が、テーブル固有の JSON スキーマファイルにエンコードされます。スキーマファイルは `headerRow` フィールドがブール値の 1 つのオブジェクトで構成されます。この値は、Parquet ファイルとヘッダー行のある .csv ファイルでは `true`、それ以外の場合は `false` である必要があります。

### マッピングテーブルスキーマ
<a name="mapped-schemas"></a>

マッピングスキーマは次のような形式です。

```
{
  "headerRow": true,
  "columns": [
    {
      "sourceHeader": STRING,
      "targetHeader": STRING,
      "type": TYPE,
      "pad": PAD
    },
    ...
  ]
}
```

`headerRow` が `true` の場合、オブジェクトの次のフィールドは `columns` になります。これには、ソースヘッダーをターゲットヘッダーにマッピングする列スキーマの配列 (つまり、出力列に含める内容を記述した JSON オブジェクト) が含まれます。
+ `sourceHeader` – データの取得元となるソース列の `STRING` ヘッダー名。
**注記**  
同じソース列を複数のターゲット列に使用できます。  
スキーマのどこにも `sourceHeader` としてリストされていない入力ファイルの列は、出力ファイルには表示されません。
+ `targetHeader` – 出力ファイル内の対応する列の `STRING` ヘッダー名。
**注記**  
このフィールドはマッピングスキーマでは省略可能です。このフィールドを省略すると、`sourceHeader` が出力ファイルのヘッダー名として再利用されます。出力列がfingerprint列またはsealed列の場合は、それぞれ `_fingerprint` または `_sealed` が追加されます。
+ `type` – 出力ファイルのターゲット列の `TYPE`。コラボレーションでの列の使用方法に応じて、`cleartext`、`sealed`、`fingerprint` のいずれかになります。
+ `pad` – `TYPE` が `sealed` の場合にのみ存在する列スキーマオブジェクトのフィールド。対応する値 `PAD` は、データを暗号化する前にどのようにパディングするかを記述するオブジェクトです。

  ```
  {
    "type": PAD_TYPE,
    "length": INT
  }
  ```

  暗号化前のパディングを指定するには、`type` と `length` を次のように使用します。
  + `PAD_TYPE` が `none` の場合 – 列のデータにはパディングが適用されず、`length` フィールドは無効になります (つまり、省略されます)。
  + `PAD_TYPE` が `fixed` の場合 – 列のデータは指定された `length` のバイト数にパディングされます。
  + `PAD_TYPE` が `max` の場合 –列のデータは、最も長い値のバイト長に `length` バイトを加えたサイズにパディングされます。

以下は、各タイプの列を含むマッピングスキーマの例です。

```
{
  "headerRow": true,
  "columns": [
    {
      "sourceHeader": "FullName",
      "targetHeader": "name",
      "type": "cleartext"
    },
    {
      "sourceHeader": "City",
      "targetHeader": "city_sealed",
      "type": "sealed",
      "pad": {
        "type": "max",
        "length": 16
      }
    },
    {
      "sourceHeader": "PhoneNumber",
      "targetHeader": "phone_number_fingerprint",
      "type": "fingerprint"
    },
    {
      "sourceHeader": "PhoneNumber",
      "targetHeader": "phone_number_sealed",
      "type": "sealed",
      "pad": {
        "type": "fixed",
        "length": 20
      }
    }
  ]
}
```

より複雑な例として、ヘッダー付きの .csv ファイルの例を以下に示します。

```
FirstName,LastName,Address,City,State,PhoneNumber,Title,Level,Notes
Jorge,Souza,12345 Mills Rd,Anytown,SC,703-555-1234,CEO,10,
Paulo,Santos,0 Street,Anytown,MD,404-555-111,CIO,9,This is a really long note that could really be a paragraph
Mateo,Jackson,1 Two St,Anytown,NY,304-555-1324,COO,9,""
Terry,Whitlock4 N St,Anytown,VA,407-555-8888,EA,7,Secret notes
Diego,Ramirez,9 Hollows Rd,Anytown,VA,407-555-1222,SDE I,4,null
John,Doe,8 Hollows Rd,Anytown,VA,407-555-4321,SDE I,4,Jane's younger brother
Jane,Doe,8 Hollows Rd,Anytown,VA,407-555-4322,SDE II,5,John's older sister
```

次のマッピングスキーマの例では、列 `FirstName` と `LastName` は `cleartext` 列です。`State` 列は `fingerprint` 列として暗号化され、また、パディングが `none` で `sealed` 列としても暗号化されます。残りの列は省略されます。

```
{
  "headerRow": true,
  "columns": [
    {
      "sourceHeader": "FirstName",
      "targetHeader": "GivenName",
      "type": "cleartext"
    },
    {
      "sourceHeader": "LastName",
      "targetHeader": "Surname",
      "type": "cleartext"
    },
    {
      "sourceHeader": "State",
      "targetHeader": "State_Join",
      "type": "fingerprint"
    },
    {
      "sourceHeader": "State",
      "targetHeader": "State",
      "type": "sealed",
      "pad": {
        "type": "none"
      }
    }
  ]
}
```

以下は、マッピングスキーマから生成された .csv ファイルです。

```
givenname,surname,state_fingerprint,state
John,Doe,01:hmac:UK8s8Cn/WR2JO/To2dTxWD73aDEe2ZUXeSHy3Tv+1Mk=,01:enc:FQ3n3Ahv9BQQNWQGcugeHzHYzEZE1vapHa2Uu4SRgSAtZ3qObjPA4TcsHt+BOkMKBcnHWI13BeGG/SBqmj7vKpI=
Paulo,Santos,01:hmac:CHF4eIrtTNgAooU9v4h9Qjc+txBnMidQTjdjWuaDTTA=,01:enc:KZ5n5GtaXACco65AXk48BQO2durDNR2ULc4YxmMC8NaZZKKJiksU1IwFadAvV4iBQ1Bus5TU5c4biez3bilfTY8=
Mateo,Jackson,01:hmac:iIRnjfNBzryusIJ1w35lgNzeY1RQ1bSfq6PDHW8Xrbk=,01:enc:mLKpS5HIOSgphdEsrzhEdIp/eN9nBO2gAbIygt4OFn4LalYn9Xyj/XUWXlmn8zFe2T4kyDTD8kGOvpQEUGxAUFk=
Diego,Ramirez,01:hmac:UK8s8Cn/WR2JO/To2dTxWD73aDEe2ZUXeSHy3Tv+1Mk=,01:enc:rmZhT98Zm+IIGw1UTjMIJP4IrW/AAltBLMXcHvnYfRgmWP623VFQ6aUnhsb2MDqEw4G5Uwg5rKKZepUxx5uKbfk=
Jorge,Souza,01:hmac:3BxJdXiFFyZ8HBbYNqqEhBVqhNOd7s2ZiKUe7QiTyo8=,01:enc:vVaqWC1VRbhvkf8gnuR7q0zxVPcvEjuaglYz34+KyyLcGZLpAmsDUc6wZ07f2KvHoOySqRsEU7dG1QfdHYcTSWE=
Terry,Whitlock01:hmac:UK8s8Cn/WR2JO/To2dTxWD73aDEe2ZUXeSHy3Tv+1Mk=,01:enc:3c9VEWbODO/xbQjdGuccLvI7oZTBdPU+SyrJIyr2kudfAxbuMQ2uRdU/q7rbgyJjxZS8M2U35ILJf/lDgTyg7cM=
Jane,Doe,01:hmac:UK8s8Cn/WR2JO/To2dTxWD73aDEe2ZUXeSHy3Tv+1Mk=,01:enc:9RWv46YLveykeNZ/G0NdlYFg+AVdOnu05hHyAYTQkPLHnyX+0/jbzD/g9ZT8GCgVE9aB5bV4ooJIXHGBVMXcjrQ=
```

### 位置テーブルスキーマ
<a name="positional-schemas"></a>

位置スキーマは次のような形式です。

```
{
  "headerRow": false,
  "columns": [
    [
      {
        "targetHeader": STRING,
        "type": TYPE,
        "pad": PAD
      },
      {
        "targetHeader": STRING,
        "type": TYPE,
        "pad": PAD
      }
    ],
    [],
    ...
  ]
}
```

`headerRow` が `false` の場合、オブジェクトの次のフィールドはエントリの配列を含む `columns` になります。各エントリは、それ自体が 0 個以上の位置列スキーマ (`sourceHeader` フィールドなし) の配列、つまり、出力に含める内容を記述した JSON オブジェクトです。
+ `sourceHeader` – データの取得元となるソース列の `STRING` ヘッダー名。
**注記**  
位置スキーマでは、このフィールドは省略する必要があります。位置スキーマの場合、ソース列は、スキーマファイルの列の対応するインデックスによって推測されます。
+ `targetHeader` – 出力ファイル内の対応する列の `STRING` ヘッダー名。
**注記**  
このフィールドは、位置スキーマでは必須です。
+ `type` – 出力ファイルのターゲット列の `TYPE`。コラボレーションでの列の使用方法に応じて、`cleartext`、`sealed`、`fingerprint` のいずれかになります。
+ `pad` – `TYPE` が `sealed` の場合にのみ存在する列スキーマオブジェクトのフィールド。対応する値 `PAD` は、データを暗号化する前にどのようにパディングするかを記述するオブジェクトです。

  ```
  {
    "type": PAD_TYPE,
    "length": INT
  }
  ```

  暗号化前のパディングを指定するには、`type` と `length` を次のように使用します。
  + `PAD_TYPE` が `none` の場合 – 列のデータにはパディングが適用されず、`length` フィールドは無効になります (つまり、省略されます)。
  + `PAD_TYPE` が `fixed` の場合 – 列のデータは指定された `length` のバイト数にパディングされます。
  + `PAD_TYPE` が `max` の場合 –列のデータは、最も長い値のバイト長に `length` バイトを加えたサイズにパディングされます。
**注記**  
`fixed` は、列のデータのバイトサイズの上限が事前にわかっている場合に便利です。その列に指定した `length` 値よりも長いデータが 1 つでもあると、エラーが発生します。  
`max` は、データのサイズに関係なく動作するため、入力データの正確なサイズが不明な場合に便利です。ただし `max` の場合は、データが 2 回暗号化されるため、処理時間が長くなります。`max` では、データを一時ファイルに読み込むときに 1 回暗号化し、列内の最も長いデータエントリがわかった後に 1 回暗号化します。  
また、最も長い値の長さは、クライアントの呼び出しの合間には保存されません。データをバッチで暗号化したり、新しいデータを定期的に暗号化したりする場合は、生成される暗号文の長さはバッチによって異なる可能性があることに注意してください。

以下は位置スキーマの例です。

```
{
  "headerRow": false,
  "columns": [
    [
      {
        "targetHeader": "name",
        "type": "cleartext"
      }
    ],
    [
      {
        "targetHeader": "city_sealed",
        "type": "sealed",
        "pad": {
          "type": "max",
          "length": 16
        }
      }
    ],
    [
      {
        "targetHeader": "phone_number_fingerprint",
        "type": "fingerprint"
      },
      {
        "targetHeader": "phone_number_sealed",
        "type": "sealed",
        "pad": {
          "type": "fixed",
          "length": 20
        }
      }
    ]
  ]
}
```

複雑な例として、先頭にヘッダー行がない .csv ファイルの例を以下に示します。

```
Jorge,Souza,12345 Mills Rd,Anytown,SC, 703 -555 -1234,CEO, 10,
Paulo,Santos, 0 Street,Anytown,MD, 404-555-111,CIO, 9,This is a really long note that could really be a paragraph
Mateo,Jackson, 1 Two St,Anytown,NY, 304-555-1324,COO, 9, ""
Terry,Whitlock, 4 N St,Anytown,VA, 407-555-8888,EA, 7,Secret notes
Diego,Ramirez, 9 Hollows Rd,Anytown,VA, 407-555-1222,SDE I, 4,null
John,Doe, 8 Hollows Rd,Anytown,VA, 407-555-4321,SDE I, 4,Jane's younger brother
Jane,Doe, 8 Hollows Rd,Anytown,VA, 407-555-4322,SDE II, 5,John's older sister
```

位置スキーマは次のような形式になります。

```
{
  "headerRow": false,
  "columns": [
    [
      {
        "targetHeader": "GivenName",
        "type": "cleartext"
      }
    ],
    [
      {
        "targetHeader": "Surname",
        "type": "cleartext"
      }
    ],
    [],
    [],
    [
      {
        "targetHeader": "State_Join",
        "type": "fingerprint"
      },
      {
        "targetHeader": "State",
        "type": "sealed",
        "pad": {
          "type": "none"
        }
      }
    ],
    [],
    [],
    [],
    []
  ]
}
```

前述のスキーマは、指定されたターゲットヘッダーがヘッダー行に含まれる出力ファイルを生成します。

```
givenname,surname,state_fingerprint,state
Mateo,Jackson,01:hmac:iIRnjfNBzryusIJ1w35lgNzeY1RQ1bSfq6PDHW8Xrbk=,01:enc:ENS6QD3cMVl9vQEGfe9MNWfR0UOupchswZFr94zOMG5jY/Q8m/Y5SA89dJwKpT5rGPp8e36h6klwDoslpFzGvU0=
Jorge,Souza,01:hmac:3BxJdXiFFyZ8HBbYNqqEhBVqhNOd7s2ZiKUe7QiTyo8=,01:enc:LKo0zirq2++XEIIIMNRjAsGMdyWUDwYaum0B+IFP+rUf1BNeZDJjtFe1Z+zbZfXQWwJy52Rt7HqvAb2WIK1oMmk=
Paulo,Santos,01:hmac:CHF4eIrtTNgAooU9v4h9Qjc+txBnMidQTjdjWuaDTTA=,01:enc:MyQKyWxJ9kvK1xDQQtXlUNwv3F+yrBRr0xrUY/1BGg5KFgOn9pK+MZ7g+ZNqZEPcPz4lht1u0t/wbTaqzOCLXFQ=
Jane,Doe,01:hmac:UK8s8Cn/WR2JO/To2dTxWD73aDEe2ZUXeSHy3Tv+1Mk=,01:enc:Pd8sbITBfb0/ttUB4svVsgoYkDfnDvgkvxzeci0Yxq54rLSwccy1o3/B50C3cpkkn56dovCwzgmmPNwrmCmYtb4=
Terry,Whitlock01:hmac:UK8s8Cn/WR2JO/To2dTxWD73aDEe2ZUXeSHy3Tv+1Mk=,01:enc:Qmtzu3B3GAXKh2KkRYTiEAaMopYedsSdF2e/ADUiBQ9kv2CxKPzWyYTD3ztmKPMka19dHre5VhUHNpO3O+j1AQ8=
Diego,Ramirez,01:hmac:UK8s8Cn/WR2JO/To2dTxWD73aDEe2ZUXeSHy3Tv+1Mk=,01:enc:ysdg+GHKdeZrS/geBIooOEPLHG68MsWpx1dh3xjb+fG5rmFmqUcJLNuuYBHhHAlxchM2WVeV1fmHkBX3mvZNvkc=
John,Doe,01:hmac:UK8s8Cn/WR2JO/To2dTxWD73aDEe2ZUXeSHy3Tv+1Mk=,01:enc:9uX0wZuO7kAPAx+Hf6uvQownkWqFSKtWS7gQIJSe5aXFquKWCK6yZN0X5Ea2N3bn03Uj1kh0agDWoiP9FRZGJA4=
```