

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.

# Protection de l'intégrité des données avec des checksums
<a name="s3-checksums"></a>

Amazon Simple Storage Service (Amazon S3) permet de spécifier une somme de contrôle lorsque vous chargez un objet. Lorsque vous spécifiez une somme de contrôle, elle est stockée avec l'objet et peut être validée lors du téléchargement de l'objet.

Les checksums fournissent une couche supplémentaire d'intégrité des données lorsque vous transférez des fichiers. Avec les checksums, vous pouvez vérifier la cohérence des données en confirmant que le fichier reçu correspond au fichier d'origine. Pour plus d'informations sur les checksums avec Amazon S3, consultez le [guide de l'utilisateur d'Amazon Simple Storage Service](https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html), y compris les [algorithmes pris en charge](https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#using-additional-checksums).

Vous avez la possibilité de choisir l'algorithme qui répond le mieux à vos besoins et de laisser le SDK calculer le checksum. Vous pouvez également fournir une valeur de somme de contrôle précalculée à l'aide de l'un des algorithmes pris en charge. 

**Note**  
 À partir de la version 1.4.0 du AWS SDK pour Kotlin, le SDK fournit des protections d'intégrité par défaut en calculant automatiquement une `CRC32` somme de contrôle pour les téléchargements. Le SDK calcule cette somme de contrôle si vous ne fournissez pas de valeur de somme de contrôle précalculée ou si vous ne spécifiez pas d'algorithme que le SDK doit utiliser pour calculer une somme de contrôle.   
Le SDK fournit également des paramètres globaux pour les protections de l'intégrité des données que vous pouvez définir en externe, que vous pouvez consulter dans le [Guide de référence AWS SDKs et sur les outils](https://docs.aws.amazon.com/sdkref/latest/guide/feature-dataintegrity.html).

Nous discutons des sommes de contrôle en deux phases de demande : le téléchargement d'un objet et le téléchargement d'un objet. 

## Charger un objet
<a name="use-service-S3-checksum-upload"></a>

 Vous chargez des objets sur Amazon S3 avec le SDK pour Kotlin en utilisant la [https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/s3/aws.sdk.kotlin.services.s3/put-object.html](https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/s3/aws.sdk.kotlin.services.s3/put-object.html)fonction avec un paramètre de requête. Le type de données de demande fournit la `checksumAlgorithm` propriété permettant le calcul de la somme de contrôle. 

L'extrait de code suivant montre une demande de téléchargement d'un objet avec une `CRC32` somme de contrôle. Lorsque le SDK envoie la demande, il calcule le `CRC32` checksum et télécharge l'objet. Amazon S3 stocke le checksum avec l'objet.

```
val request = PutObjectRequest {
    bucket = "{{amzn-s3-demo-bucket}}"
    key = "{{key}}"
    checksumAlgorithm = ChecksumAlgorithm.CRC32
}
```

Si vous ne fournissez pas d'algorithme de somme de contrôle avec la demande, le comportement de somme de contrôle varie en fonction de la version du SDK que vous utilisez, comme indiqué dans le tableau suivant.

**Comportement de somme de contrôle lorsqu'aucun algorithme de somme de contrôle n'est fourni**


| Version du SDK Kotlin | Comportement de Checksum | 
| --- | --- | 
| antérieur à la version 1.4.0 | Le SDK ne calcule pas automatiquement une somme de contrôle basée sur le CRC et ne la fournit pas dans la demande. | 
| 1.4.0 ou version ultérieure | Le SDK utilise l'`CRC32`algorithme pour calculer le checksum et le fournit dans la demande. Amazon S3 valide l'intégrité du transfert en calculant sa propre somme de `CRC32` contrôle et en la comparant à la somme de contrôle fournie par le SDK. Si les sommes de contrôle correspondent, la somme de contrôle est enregistrée avec l'objet. | 

### Utiliser une valeur de somme de contrôle précalculée
<a name="use-service-S3-checksum-upload-pre"></a>

Une valeur de somme de contrôle précalculée fournie avec la demande désactive le calcul automatique par le SDK et utilise la valeur fournie à la place.

L'exemple suivant montre une demande avec une somme de SHA256 contrôle précalculée.

```
val request = PutObjectRequest {
    bucket = "{{amzn-s3-demo-bucket}}"
    key = "{{key}}"
    body = ByteStream.fromFile(File("file_to_upload.txt"))
    checksumAlgorithm = ChecksumAlgorithm.SHA256
    checksumSha256 = "cfb6d06da6e6f51c22ae3e549e33959dbb754db75a93665b8b579605464ce299"
}
```

Si Amazon S3 détermine que la valeur de la somme de contrôle est incorrecte pour l'algorithme spécifié, le service renvoie une réponse d'erreur.

### Chargements partitionnés
<a name="use-service-S3-checksum-upload-multi"></a>

Vous pouvez également utiliser des checksums pour les téléchargements partitionnés.

 Vous devez spécifier l'algorithme de somme de contrôle dans la `CreateMultipartUpload` demande et dans chaque `UploadPart` demande. Enfin, vous devez spécifier la somme de contrôle de chaque partie du`CompleteMultipartUpload`. L'exemple suivant montre comment créer un téléchargement partitionné avec l'algorithme de somme de contrôle spécifié. 

```
val multipartUpload = s3.createMultipartUpload {
    bucket = "{{amzn-s3-demo-bucket}}"
    key = "{{key}}"
    checksumAlgorithm = ChecksumAlgorithm.Sha1
}

val partFilesToUpload = listOf("data-part1.csv", "data-part2.csv", "data-part3.csv")

val completedParts = partFilesToUpload
    .mapIndexed { i, fileName ->
        val uploadPartResponse = s3.uploadPart {
            bucket = "amzn-s3-demo-bucket"
            key = "key"
            body = ByteStream.fromFile(File(fileName))
            uploadId = multipartUpload.uploadId
            partNumber = i + 1 // Part numbers begin at 1.
            checksumAlgorithm = ChecksumAlgorithm.Sha1
        }

        CompletedPart {
            eTag = uploadPartResponse.eTag
            partNumber = i + 1
            checksumSha1 = uploadPartResponse.checksumSha1
        }
    }

s3.completeMultipartUpload {
    uploadId = multipartUpload.uploadId
    bucket = "{{amzn-s3-demo-bucket}}"
    key = "{{key}}"
    multipartUpload {
        parts = completedParts
    }
}
```

## Télécharger un objet
<a name="use-service-S3-checksum-download"></a>

Lorsque vous utilisez la méthode [GetObject](https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/s3/aws.sdk.kotlin.services.s3/-s3-client/get-object.html) pour télécharger un objet, le SDK valide automatiquement la somme de contrôle la valeur de la clé est. `ChecksumMode` `enabled` lorsque la `checksumMode` propriété du générateur pour le `GetObjectRequest` est définie sur`ChecksumMode.Enabled`. 

La demande contenue dans l'extrait suivant demande au SDK de valider la somme de contrôle dans la réponse en calculant la somme de contrôle et en comparant les valeurs.

```
val request = GetObjectRequest {
    bucket = "{{amzn-s3-demo-bucket}}"
    key = "{{key}}"
    checksumMode = ChecksumMode.Enabled
}
```

**Note**  
Si l'objet n'a pas été chargé avec une somme de contrôle, aucune validation n'a lieu. 

Si vous utilisez une version 1.4.0 ou ultérieure du SDK, le SDK vérifie automatiquement l'intégrité des `getObject` demandes sans ajouter de contenu `checksumMode = ChecksumMode.Enabled` à la demande.

### Validation asynchrone
<a name="service-s3-checksum-getObject-kotlin-asyncValidation"></a>

Comme le SDK pour Kotlin utilise des réponses en streaming lorsqu'il télécharge un objet depuis Amazon S3, la somme de contrôle sera calculée au fur et à mesure que vous consommez l'objet. Par conséquent, vous *devez* consommer l'objet pour que la somme de contrôle soit validée.

L'exemple suivant montre comment valider une somme de contrôle en consommant entièrement la réponse.

```
val request = GetObjectRequest {
    bucket = "{{amzn-s3-demo-bucket}}"
    key = "{{key}}"
    checksumMode = checksumMode.Enabled
}

val response = s3Client.getObject(request) {
    println(response.body?.decodeToString()) // Fully consume the object.
    // The checksum is valid.
}
```

En revanche, le code de l'exemple suivant n'utilise pas l'objet de quelque manière que ce soit, de sorte que le checksum n'est pas validé.

```
s3Client.getObject(request) {
    println("Got the object.")
}
```

Si la somme de contrôle calculée par le SDK ne correspond pas à la somme de contrôle attendue envoyée avec la réponse, le SDK renvoie un. `ChecksumMismatchException`