

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# (Facultatif) Créez un schéma (utilisateurs avancés)
<a name="create-schema"></a>

La création manuelle d'un schéma est réservée aux utilisateurs expérimentés.

Vous trouverez ci-dessous une description du format de fichier de schéma JSON pour les fichiers d'entrée avec ou sans en-têtes de colonne. Les utilisateurs avancés peuvent directement écrire ou modifier le schéma s'ils le souhaitent.

**Note**  
Le client de chiffrement C3R peut vous aider à créer un schéma par le biais du processus interactif décrit dans [Exemple : génération d'un schéma de chiffrement avec des cleartext colonnes sealedfingerprint, et](gen-encryption-schema-csv.md#gen-encryption-schema) ou par la création d'un modèle de stub.

## Schémas de tables cartographiées et positionnelles
<a name="mapped-and-positional-schemas"></a>

La section suivante décrit deux types de schémas de table : 
+ **Schéma de table mappé** — Ce schéma est utilisé pour chiffrer les fichiers .csv avec une ligne d'en-tête et des fichiers. Apache Parquet
+ **Schéma de table positionnelle** — Ce schéma est utilisé pour chiffrer des fichiers .csv sans ligne d'en-tête.

Le client de chiffrement C3R peut chiffrer un fichier tabulaire pour une collaboration. Pour ce faire, il doit disposer d'un fichier de schéma correspondant qui indique comment la sortie cryptée doit être dérivée de l'entrée.

Le client de chiffrement C3R peut aider à générer un schéma pour un `INPUT` fichier en exécutant la commande C3R encryption client schema sur la ligne de commande. Voici un exemple de commande`java -jar c3r-cli.jar schema --interactive INPUT`.

Le schéma indique les informations suivantes : 

1. Quelles colonnes source correspondent à quelles colonnes transformées dans le fichier de sortie par le biais de leur nom d'en-tête (schémas mappés) ou de leur position (schémas positionnels)

1. Quelles colonnes cibles doivent rester cleartext

1. Quelles colonnes cibles doivent être cryptées pour les SELECT requêtes

1. Quelles colonnes cibles doivent être cryptées pour les JOIN requêtes

Ces informations sont codées dans un fichier de schéma JSON spécifique à une table, composé d'un seul objet dont `headerRow` le champ est une valeur booléenne. La valeur doit être `true` pour Parquet les fichiers et les fichiers .csv avec une ligne d'en-tête, et `false` sinon. 

### Schéma de table mappé
<a name="mapped-schemas"></a>

Le schéma mappé a la forme suivante.

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

Si tel `headerRow` est le cas`true`, le champ suivant de l'objet contient un tableau de schémas de colonnes qui mappent les en-têtes source aux en-têtes cibles (c'est-à-dire des objets JSON décrivant ce que les colonnes de sortie doivent contenir). `columns` 
+ `sourceHeader`— Le nom d'`STRING`en-tête de la colonne source dont les données sont dérivées. 
**Note**  
La même colonne source peut être utilisée pour plusieurs colonnes cibles.  
Une colonne du fichier d'entrée qui n'est répertoriée `sourceHeader` nulle part dans le schéma n'apparaît pas dans le fichier de sortie. 
+ `targetHeader`— Le nom d'`STRING`en-tête de la colonne correspondante dans le fichier de sortie. 
**Note**  
Ce champ est facultatif pour les schémas mappés. Si ce champ est omis, il `sourceHeader` est réutilisé comme nom d'en-tête dans la sortie. L'`_fingerprint`un ou l'autre `_sealed` est ajouté si la colonne de sortie est une fingerprint colonne ou une sealed colonne respectivement. 
+ `type`— Celui `TYPE` de la colonne cible dans le fichier de sortie. C'est-à-dire l'une des options `cleartext` ou `fingerprint` selon la manière dont la colonne sera utilisée dans le cadre de la collaboration. `sealed` 
+ `pad`— Champ d'un objet de schéma de colonne qui n'est présent que lorsque `TYPE` c'est le cas`sealed`. La valeur correspondante de `PAD` est un objet qui décrit la manière dont les données doivent être remplies avant d'être cryptées.

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

  Pour spécifier le rembourrage avant le chiffrement, `type` `length` ils sont utilisés comme suit : 
  + `PAD_TYPE`as `none` — Aucun remplissage ne sera appliqué aux données de la colonne et le `length` champ n'est pas applicable (c'est-à-dire omis).
  + `PAD_TYPE`as `fixed` — Les données de la colonne sont complétées au nombre `length` d'octets spécifié.
  + `PAD_TYPE`as `max` — Les données de la colonne sont complétées à la taille de l'octet de la valeur la plus longue plus un `length` octet supplémentaire.

Voici un exemple de schéma mappé, avec une colonne de chaque type.

```
{
  "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
      }
    }
  ]
}
```

À titre d'exemple plus complexe, voici un exemple de fichier .csv avec des en-têtes. 

```
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
```

Dans l'exemple de schéma mappé suivant, les colonnes `FirstName` et `LastName` sont des `cleartext` colonnes. La `State` colonne est cryptée en tant que `fingerprint` colonne et en tant que `sealed` colonne avec un rembourrage de`none`. Les autres colonnes sont omises. 

```
{
  "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"
      }
    }
  ]
}
```

Le fichier .csv qui résulte du schéma mappé est le suivant. 

```
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=
```

### Schéma de tableau positionnel
<a name="positional-schemas"></a>

Le schéma positionnel a la forme suivante.

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

Si `headerRow` tel est le cas`false`, le champ suivant de l'objet est`columns`, qui contient un tableau d'entrées. Chaque entrée est elle-même un tableau de zéro ou plusieurs schémas de colonnes positionnels (aucun `sourceHeader` champ), qui sont des objets JSON décrivant ce que la sortie doit contenir. 
+ `sourceHeader`— Le nom d'`STRING`en-tête de la colonne source dont les données sont dérivées. 
**Note**  
Ce champ doit être omis dans les schémas de position. Dans les schémas positionnels, la colonne source est déduite par l'index correspondant de la colonne dans le fichier de schéma.
+ `targetHeader`— Le nom d'`STRING`en-tête de la colonne correspondante dans le fichier de sortie. 
**Note**  
Ce champ est obligatoire pour les schémas de position. 
+ `type`— Celui `TYPE` de la colonne cible dans le fichier de sortie. C'est-à-dire l'une des options `cleartext` ou `fingerprint` selon la manière dont la colonne sera utilisée dans le cadre de la collaboration. `sealed` 
+ `pad`— Champ d'un objet de schéma de colonne qui n'est présent que lorsque `TYPE` c'est le cas`sealed`. La valeur correspondante de `PAD` est un objet qui décrit la manière dont les données doivent être remplies avant d'être cryptées.

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

  Pour spécifier le rembourrage avant le chiffrement, `type` `length` ils sont utilisés comme suit : 
  + `PAD_TYPE`as `none` — Aucun remplissage ne sera appliqué aux données de la colonne et le `length` champ n'est pas applicable (c'est-à-dire omis).
  + `PAD_TYPE`as `fixed` — Les données de la colonne sont complétées au nombre `length` d'octets spécifié.
  + `PAD_TYPE`as `max` — Les données de la colonne sont complétées à la taille de l'octet de la valeur la plus longue plus un `length` octet supplémentaire.
**Note**  
`fixed`est utile si vous connaissez à l'avance la limite supérieure de la taille en octets des données de la colonne. Une erreur est générée si les données de cette colonne sont plus longues que celles spécifiées`length`.   
`max`est pratique lorsque la taille exacte des données d'entrée est inconnue, car elle fonctionne quelle que soit la taille des données. Cependant, `max` cela nécessite un temps de traitement supplémentaire car il chiffre les données deux fois. `max`chiffre les données une fois lorsqu'elles sont lues dans le fichier temporaire et une fois que l'entrée de données la plus longue dans la colonne est connue.   
De plus, la longueur de la valeur la plus longue n'est pas enregistrée entre les appels du client. Si vous prévoyez de chiffrer vos données par lots, ou de chiffrer régulièrement de nouvelles données, sachez que la longueur du texte chiffré peut varier d'un lot à l'autre.

Voici un exemple de schéma positionnel.

```
{
  "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
        }
      }
    ]
  ]
}
```

À titre d'exemple complexe, voici un exemple de fichier .csv s'il ne contient pas la première ligne avec les en-têtes. 

```
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
```

Le schéma positionnel se présente sous la forme suivante. 

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

Le schéma précédent produit le fichier de sortie suivant avec une ligne d'en-tête contenant les en-têtes cibles spécifiés. 

```
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=
```