

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Proteção da integridade de dados com somas de verificação
<a name="s3-checksums"></a>

O Amazon Simple Storage Service (Amazon S3) oferece a capacidade de especificar uma soma de verificação ao fazer upload de um objeto. Quando você especifica uma soma de verificação, ela é armazenada com o objeto e pode ser validada quando o objeto é baixado.

As somas de verificação fornecem uma camada adicional de integridade de dados quando você transfere arquivos. Com somas de verificação, você pode verificar a consistência de dados confirmando que o arquivo recebido corresponde ao arquivo original. Consulte mais informações sobre as somas de verificação no Amazon S3 no [Guia do usuário do Amazon Simple Storage Service](https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html), incluindo os [algoritmos compatíveis](https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#using-additional-checksums).

Você tem a flexibilidade de escolher o algoritmo mais adequado às suas necessidades e deixar que o SDK calcule a soma de verificação. Como alternativa, você pode fornecer um valor de soma de verificação pré-calculado usando um dos algoritmos compatíveis. 

**nota**  
A partir da versão [v.1.74.1 do módulo do Amazon S3](https://github.com/aws/aws-sdk-go-v2/blob/v1.34.0/service/s3/CHANGELOG.md#v1741-2025-01-24), o SDK fornece proteções de integridade padrão calculando automaticamente uma soma de verificação `CRC32` para uploads. O SDK calcula essa soma de verificação se você não fornecer um valor de soma de verificação pré-calculado ou se não especificar um algoritmo que o SDK deva usar para calcular uma soma de verificação.  
Ele também fornece configurações globais para proteções de integridade de dados que você pode definir externamente. Leia mais sobre elas no [Guia de referência de SDKs e ferramentas da AWS](https://docs.aws.amazon.com/sdkref/latest/guide/feature-dataintegrity.html).

Discutimos somas de verificação em duas fases de solicitação: upload de um objeto e download de um objeto.

## Fazer upload de um objeto
<a name="use-service-S3-checksum-upload"></a>

Quando você faz upload de um objeto com o método `putObject` e fornece um algoritmo de soma de verificação, o SDK calcula a soma de verificação para o algoritmo especificado.

O trecho de código a seguir mostra uma solicitação para fazer upload de um objeto com uma soma de verificação `CRC32`. Quando o SDK envia a solicitação, ele calcula a soma de verificação `CRC32` e carrega o objeto. O Amazon S3 valida a integridade do conteúdo calculando a soma de verificação e comparando-a com a soma de verificação fornecida pelo SDK. Depois, o Amazon S3 armazena a soma de verificação com o objeto.

```
out, err := s3Client.PutObject(context.Background(), &s3.PutObjectInput{
     Bucket:            aws.String("bucket"),
     Key:               aws.String("key"),
     ChecksumAlgorithm: types.ChecksumAlgorithmCrc32,
     Body:              strings.NewReader("Hello World"),
 })
```

Se você não fornecer um algoritmo de soma de verificação com a solicitação, o comportamento da soma de verificação variará com a versão do SDK usada, conforme mostrado na tabela a seguir.

**Comportamento da soma de verificação quando nenhum algoritmo de soma de verificação é fornecido**


| Versão do módulo do Amazon S3 do AWS SDK para Go | Comportamento da soma de verificação | 
| --- | --- | 
| Antes da v1.74.1 | O SDK não calcula automaticamente uma soma de verificação baseada em CRC nem a inclui na solicitação. | 
| v1.74.1 ou posterior |  O SDK usa o algoritmo `CRC32` para calcular a soma de verificação e a fornece na solicitação. O Amazon S3 valida a integridade da transferência calculando sua própria soma de verificação `CRC32` e a compara com a soma de verificação fornecida pelo SDK. Se elas corresponderem, a soma de verificação será salva com o objeto.   | 

### Usar um valor de soma de verificação pré-calculado
<a name="use-service-S3-checksum-upload-pre"></a>

Um valor de soma de verificação pré-calculado fornecido com a solicitação desabilita a computação automática pelo SDK e, em vez disso, usa o valor fornecido.

O exemplo a seguir mostra uma solicitação com uma soma de verificação SHA256 pré-calculada.

```
out, err := s3Client.PutObject(context.Background(), &s3.PutObjectInput{
     Bucket:        aws.String("bucket"),
     Key:           aws.String("key"),
     ChecksumCRC32: aws.String("checksumvalue"),
     Body:          strings.NewReader("Hello World"),
 })
```

Se o Amazon S3 determinar que o valor da soma de verificação está incorreto para o algoritmo especificado, o serviço retornará uma resposta de erro.

### Carregamentos fracionados
<a name="use-service-S3-checksum-upload-multi"></a>

Você também pode usar somas de verificação com carregamentos fracionados.

 O AWS SDK para Go fornece duas opções para usar somas de verificação com uploads de várias partes. A primeira opção usa o gerenciador de transferências que especifica o algoritmo `CRC32` para o upload.

```
s3Client := s3.NewFromConfig(cfg)
     transferManager := manager.NewUploader(s3Client)
     out, err := transferManager.Upload(context.Background(), &s3.PutObjectInput{
             Bucket:            aws.String("bucket"),
             Key:               aws.String("key"),
             Body:              large file to trigger multipart upload,
             ChecksumAlgorithm: types.ChecksumAlgorithmCrc32,
     })
```

Se você não fornecer um algoritmo de soma de verificação ao usar o gerenciador de transferências para uploads, o SDK calculará automaticamente a soma de verificação com base no algoritmo `CRC32`. O SDK executa esse cálculo para todas as versões do SDK.

A segunda opção usa o cliente do [Amazon S3](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/s3) para executar o upload de várias partes. Se você especificar uma soma de verificação com essa abordagem, deverá indicar o algoritmo a ser usado no início do carregamento. Você também deve especificar o algoritmo para a solicitação de cada parte e fornecer a soma de verificação calculada para cada parte após o carregamento.

```
s3Client := s3.NewFromConfig(cfg)
     createMultipartUploadOutput, err := s3Client.CreateMultipartUpload(context.Background(), &s3.CreateMultipartUploadInput{
             Bucket:            aws.String("bucket"),
             Key:               aws.String("key"),
             ChecksumAlgorithm: types.ChecksumAlgorithmCrc32,
          })
     if err != nil {
             log.Fatal("err create multipart upload ", err)
     }

     var partsBody []io.Reader // this is just an example parts content, you should load your target file in your code
     partNum := int32(1)
     var completedParts []types.CompletedPart
     for _, body := range partsBody {
         uploadPartOutput, err := s3Client.UploadPart(context.Background(), &s3.UploadPartInput{
             Bucket:            aws.String("bucket"),
             Key:               aws.String("key"),
             ChecksumAlgorithm: types.ChecksumAlgorithmCrc32,
             Body:              body,
             PartNumber:        aws.Int32(partNum),
             UploadId:          createMultipartUploadOutput.UploadId,
         })
         if err != nil {
             log.Fatal("err upload part ", err)
         }

         completedParts = append(completedParts, types.CompletedPart{
             PartNumber:    aws.Int32(partNum),
             ETag:          uploadPartOutput.ETag,
             ChecksumCRC32: uploadPartOutput.ChecksumCRC32,
         })
         partNum++
     }

     completeMultipartUploadOutput, err := s3Client.CompleteMultipartUpload(context.Background(), &s3.CompleteMultipartUploadInput{
         Bucket:   aws.String("bucket"),
         Key:      aws.String("key"),
         UploadId: createMultipartUploadOutput.UploadId,
         MultipartUpload: &types.CompletedMultipartUpload{
             Parts: completedParts,
         },
     })
     if err != nil {
         log.Fatal("err complete multipart upload ", err)
     }
```

## Fazer download de um objeto
<a name="use-service-S3-checksum-download"></a>

Quando você usa o método [GetObject](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/s3#Client.GetObject) para baixar um objeto, o SDK valida automaticamente a soma de verificação quando o campo `ChecksumMode` de `GetObjectInput` é definido como `types.ChecksumModeEnabled`. 

A solicitação no trecho a seguir direciona o SDK a validar a soma de verificação na resposta calculando a soma de verificação e comparando os valores.

```
out, err := s3Client.GetObject(context.Background(), &s3.GetObjectInput{
     Bucket:       aws.String("bucket"),
     Key:          aws.String("key"),
     ChecksumMode: types.ChecksumModeEnabled,
 })
```

Se o objeto não tiver sido carregado com uma soma de verificação, nenhuma validação ocorrerá.