

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Protección de la integridad de los datos con sumas de comprobación
<a name="s3-checksums"></a>

Amazon Simple Storage Service (Amazon S3) permite especificar una suma de comprobación al cargar un objeto. Cuando se especifica una suma de comprobación, esta se almacena con el objeto y se puede validar cuando se descarga el objeto.

Las sumas de comprobación proporcionan un nivel adicional de integridad de los datos al transferir archivos. Con las sumas de comprobación, puede comprobar la coherencia de datos verificando que el archivo recibido coincide con el archivo original. Para obtener más información sobre las sumas de comprobación con Amazon S3, consulte la [Guía del usuario de Amazon Simple Storage Service](https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html), que incluye los [algoritmos compatibles](https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#using-additional-checksums).

Puede elegir el algoritmo que mejor se adapte a sus necesidades y dejar que el SDK calcule la suma de comprobación. También puede especificar un valor de suma de comprobación precalculada mediante uno de los algoritmos compatibles. 

**nota**  
 A partir de la versión 1.4.0 del AWS SDK para Kotlin, el SDK proporciona protecciones de integridad predeterminadas al calcular automáticamente una suma de comprobación para las cargas. `CRC32` El SDK calcula esta suma de comprobación si no se proporciona un valor de suma de comprobación precalculado o si no se especifica un algoritmo que el SDK deba utilizar para calcular una suma de comprobación.   
El SDK también proporciona una configuración global para las protecciones de la integridad de los datos que puede configurar de forma externa, sobre la que puede leer en la Guía de referencia de [herramientas AWS SDKs y herramientas](https://docs.aws.amazon.com/sdkref/latest/guide/feature-dataintegrity.html).

Analizaremos las sumas de comprobación en dos fases de solicitud: carga del objeto y descarga del objeto. 

## Cargar un objeto
<a name="use-service-S3-checksum-upload"></a>

Para cargar objetos en Amazon S3 con el SDK de Kotlin, use la función [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) con un parámetro de solicitud. El tipo de datos de la solicitud indica la propiedad `checksumAlgorithm` para que se pueda calcular la suma de comprobación. 

El siguiente fragmento de código muestra una solicitud para cargar un objeto con una suma de comprobación `CRC32`. Cuando el SDK envía la solicitud, calcula la suma de comprobación `CRC32` y carga el objeto. Amazon S3 almacena la suma de comprobación en el objeto.

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

Si no proporciona un algoritmo de suma de comprobación con la solicitud, el comportamiento de la suma de comprobación varía en función de la versión del SDK que utilice, tal y como se muestra en la siguiente tabla.

**Comportamiento de la suma de comprobación cuando no se proporciona ningún algoritmo de suma de comprobación**


| Versión del SDK de Kotlin | Comportamiento de la suma de comprobación | 
| --- | --- | 
| antes de 1.4.0 | El SDK no calcula automáticamente una suma de comprobación basada en CRC ni la proporciona en la solicitud. | 
| 1.4.0 o posterior | El SDK usa el algoritmo `CRC32` para calcular la suma de comprobación y la proporciona en la solicitud. Amazon S3 valida la integridad de la transferencia calculando su propia suma de comprobación `CRC32` y la compara con la suma de comprobación proporcionada por el SDK. Si las sumas de comprobación coinciden, la suma de comprobación se guarda con el objeto. | 

### Utilizar un valor de suma de comprobación calculado previamente
<a name="use-service-S3-checksum-upload-pre"></a>

Un valor de suma de comprobación precalculado proporcionado con la solicitud desactiva el cálculo automático por parte del SDK y utiliza el valor proporcionado en su lugar.

El siguiente ejemplo muestra una solicitud con una suma de control calculada previamente SHA256.

```
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 determina que el valor de la suma de comprobación es incorrecto para el algoritmo especificado, el servicio devuelve una respuesta de error.

### Cargas multiparte
<a name="use-service-S3-checksum-upload-multi"></a>

También puede utilizar sumas de comprobación en las cargas multiparte.

 Debe especificar el algoritmo de la suma de comprobación en la solicitud `CreateMultipartUpload` y en cada solicitud `UploadPart`. Por último, debe especificar la suma de comprobación de cada parte en `CompleteMultipartUpload`. En el siguiente ejemplo se muestra cómo crear una carga multiparte con el algoritmo de suma de comprobación especificado.

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

## Descargar un objeto
<a name="use-service-S3-checksum-download"></a>

Cuando se utiliza el método [getObject](https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/s3/aws.sdk.kotlin.services.s3/-s3-client/get-object.html) para descargar un objeto, el SDK valida automáticamente la suma de comprobación cuando la propiedad `checksumMode` del compilador de `GetObjectRequest` se establece como `ChecksumMode.Enabled`. 

La solicitud del siguiente fragmento indica al SDK que valide la suma de comprobación de la respuesta calculándola y comparando los valores.

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

**nota**  
Si el objeto no se cargó con una suma de comprobación, no se realizará ninguna validación. 

Si utiliza una versión 1.4.0 o posterior del SDK, el SDK comprueba automáticamente la integridad de las solicitudes `getObject` sin agregar `checksumMode = ChecksumMode.Enabled` a la solicitud.

### Validación asíncrona
<a name="service-s3-checksum-getObject-kotlin-asyncValidation"></a>

Como el SDK para Kotlin utiliza respuestas de streaming cuando descarga un objeto de Amazon S3, la suma de comprobación se calculará a medida que se utilice el objeto. Por lo tanto, *debe* usar el objeto para validar la suma de comprobación.

En el siguiente ejemplo se muestra cómo validar una suma de comprobación consumiendo por completo la respuesta.

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

Por el contrario, el código del siguiente ejemplo no usa el objeto de ninguna manera, por lo que la suma de comprobación no se valida.

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

Si la suma de comprobación calculada por el SDK no coincide con la suma de comprobación esperada enviada con la respuesta, el SDK devuelve una excepción del tipo `ChecksumMismatchException`.