

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á.

# Migração do cliente de criptografia Amazon S3 (V1 para V2)
<a name="s3-encryption-migration-v1-v2"></a>

**nota**  
Se você estiver usando a V2 do cliente de criptografia Amazon S3 e quiser migrar para a V3, consulte. [Migração do cliente de criptografia Amazon S3 (V2 para V3)](s3-encryption-migration-v2-v3.md)

Este tópico mostra como migrar as aplicações da versão 1 (V1) do cliente de criptografia do Amazon Simple Storage Service (Amazon S3) para a versão 2 (V2) e garantir a disponibilidade das aplicações durante todo o processo de migração.

## Visão geral da migração
<a name="migration-overview-v1-v2"></a>

Essa migração acontece em duas fases:

1. **Atualize os clientes existentes para ler novos formatos.** Primeiramente, implante a versão atualizada do AWS SDK para C\+\+ na aplicação. Isso permite que os clientes de criptografia existentes da V1 descriptografem objetos escritos pelos novos clientes da V2. Se seu aplicativo usa vários AWS SDKs, você deve atualizar cada SDK separadamente.

2. **Migrar clientes de criptografia e descriptografia para a V2.** Depois que todos os seus clientes de criptografia da V1 puderem ler os novos formatos, você poderá migrar seus clientes de criptografia e descriptografia existentes para suas respectivas versões da V2.

## Atualizar os clientes existentes para ler novos formatos
<a name="update-existing-clients-to-read-new-formats-v1-v2"></a>

Você deve primeiro atualizar seus clientes existentes para a versão mais recente do SDK. Depois de concluir essa etapa, os clientes V1 do seu aplicativo poderão descriptografar objetos criptografados por clientes de criptografia V2 sem atualizar a base de código do seu aplicativo.

### Crie e instale a versão mais recente do AWS SDK para C\+\+
<a name="build-and-install-the-latest-version-of-the-sdk-cpp-v1-v2"></a>

 **Aplicações que consomem o SDK do código-fonte** 

Se você criar e instalar o AWS SDK para C\+\+ do código-fonte, baixe ou clone o código-fonte do SDK a partir de [`aws/aws-sdk-cpp`](https://github.com/aws/aws-sdk-cpp)agora. GitHub Depois, repita as etapas normais de compilação e instalação.

Se você estiver atualizando AWS SDK para C\+\+ de uma versão anterior à 1.8.x, consulte este [CHANGELOG](https://github.com/aws/aws-sdk-cpp/blob/master/CHANGELOG.md) para ver as alterações significativas introduzidas em cada versão principal. Para obter mais informações sobre como criar e instalar o AWS SDK para C\+\+, consulte[Obtendo o AWS SDK para C\+\+ do código-fonte](sdk-from-source.md).

 **Aplicações que consomem o SDK do Vcpkg** 

Se sua aplicação usa o [Vcpkg](https://github.com/microsoft/vcpkg) para monitorar as atualizações do SDK, basta usar o método de atualização do Vcpkg existente para atualizar o SDK para a versão mais recente. Lembre-se de que há um atraso entre o lançamento da versão e a disponibilização dela por meio de um gerenciador de pacotes. A versão mais recente está sempre disponível por meio da [instalação do código-fonte](sdk-from-source.md). 

Você pode executar o seguinte comando para atualizar o pacote`aws-sdk-cpp`:

```
vcpkg upgrade aws-sdk-cpp
```

E verifique a versão do pacote `aws-sdk-cpp`:

```
vcpkg list aws-sdk-cpp
```

A versão deve ser no mínimo 1.8.24.

Para obter mais informações sobre como usar o Vcpkg com o AWS SDK para C\+\+, consulte. [Obtendo o AWS SDK para C\+\+ de um gerenciador de pacotes](sdk-from-pm.md)

### Compilar, instalar e implantar suas aplicações
<a name="build-install-and-deploy-your-applications-v1-v2"></a>

Se seu aplicativo estiver vinculado estaticamente ao AWS SDK para C\+\+, alterações de código não serão necessárias em seu aplicativo, mas você deverá criar seu aplicativo novamente para consumir as alterações mais recentes do SDK. Essa etapa não é necessária para a vinculação dinâmica.

Depois de atualizar a versão de dependência do seu aplicativo e verificar a funcionalidade do aplicativo, continue implantando seu aplicativo em sua frota. Depois de concluir a implantação da aplicação, você poderá passar para a próxima fase de migração para usar os clientes de criptografia e descriptografia da V2.

## Migrar clientes de criptografia e descriptografia para a V2
<a name="migrate-encryption-and-decryption-clients-to-v2-v1-v2"></a>

As etapas a seguir mostram como migrar com êxito seu código da V1 para a V2 do cliente de criptografia do Amazon S3. Como as alterações de código são necessárias, você precisará reconstruir seu aplicativo, independentemente de ele estar vinculado estática ou dinamicamente ao. AWS SDK para C\+\+

### Usar novos materiais de criptografia
<a name="using-new-encryption-materials-v1-v2"></a>

Com os clientes de criptografia V2 do Amazon S3 e a configuração de criptografia V2, os seguintes materiais foram descontinuados:
+  `SimpleEncryptionMaterials` 
+  `KMSEncryptionMaterials` 

Eles foram substituídos pelos seguintes materiais de criptografia segura:
+  `SimpleEncryptionMaterialsWithGCMAAD` 
+  `KMSWithContextEncryptionMaterials` 

As seguintes alterações de código são necessárias para criar um cliente de criptografia V2 do S3:
+   
**Se você estiver usando `KMSEncryptionMaterials` ao criar um cliente de criptografia do S3:**  
  + Ao criar um cliente de criptografia V2 do S3, substitua `KMSEncryptionMaterials` por `KMSWithContextEncryptionMaterials` e especifique-o na configuração da criptografia V2.
  + Ao colocar um objeto com clientes de criptografia V2 do Amazon S3, você deve fornecer explicitamente um mapa de contexto de string como o contexto do KMS para criptografar a CEK. Pode ser um mapa vazio.
+   
**Se você estiver usando `SimpleEncryptionMaterials` ao criar um cliente de criptografia do S3:**  
  + Ao criar um cliente de criptografia V2 do Amazon S3, substitua `SimpleEncryptionMaterials` por `SimpleEncryptionMaterialsWithGCMAAD` e especifique-o na configuração da criptografia V2.
  + Ao colocar um objeto com clientes de criptografia V2 do Amazon S3, você deve fornecer explicitamente um mapa de contexto de string vazio. Caso contrário, o SDK exibirá um erro.

 **Exemplo: usando o algoritmo KMS/KMSWithContext Key Wrap** 

 *Pré-migração (empacotamento de chaves do KMS)* 

```
auto materials = Aws::MakeShared<KMSEncryptionMaterials>("s3Encryption", CUSTOMER_MASTER_KEY_ID);
CryptoConfiguration cryptoConfig;
S3EncryptionClient encryptionClient(materials, cryptoConfig);
// Code snippet here to setup the putObjectRequest object.
encryptionClient.PutObject(putObjectRequest);
```

 *Pós-migração (quebra de chave de KMSWith contexto)* 

```
auto materials = Aws::MakeShared<KMSWithContextEncryptionMaterials>("s3EncryptionV2", CUSTOMER_MASTER_KEY_ID);
CryptoConfigurationV2 cryptoConfig(materials);
S3EncryptionClientV2 encryptionClient(cryptoConfig);
// Code snippet here to setup the putObjectRequest object.
Aws::Map<Aws::String, Aws::String> kmsContextMap;
kmsContextMap.emplace("client", "aws-sdk-cpp");
kmsContextMap.emplace("version", "1.8.0");
encryptionClient.PutObject(putObjectRequest, kmsContextMap /* could be empty as well */);
```

 **Exemplo: usar o algoritmo de empacotamento de chaves AES/AES-GCM** 

 *Pré-migração (empacotamento de chaves AES)* 

```
auto materials = Aws::MakeShared<SimpleEncryptionMaterials>("s3Encryption", HashingUtils::Base64Decode(AES_MASTER_KEY_BASE64));
CryptoConfiguration cryptoConfig;
S3EncryptionClient encryptionClient(materials, cryptoConfig);
// Code snippet here to setup the putObjectRequest object.
encryptionClient.PutObject(putObjectRequest);
```

 *Pós-migração (empacotamento de chaves AES-GCM)* 

```
auto materials = Aws::MakeShared<SimpleEncryptionMaterialsWithGCMAAD>("s3EncryptionV2", HashingUtils::Base64Decode(AES_MASTER_KEY_BASE64));
CryptoConfigurationV2 cryptoConfig(materials);
S3EncryptionClientV2 encryptionClient(cryptoConfig);
// Code snippet here to setup the putObjectRequest object.
encryptionClient.PutObject(putObjectRequest, {} /* must be an empty map */);
```

## Exemplos adicionais
<a name="additional-examples-v1-v2"></a>

Os exemplos a seguir demonstram como abordar casos de uso específicos relacionados à migração da V1 para a V2.

### Descriptografar objetos criptografados por clientes de criptografia legados do Amazon S3
<a name="decrypt-objects-encrypted-by-legacy-amazon-s3-encryption-clients-v1-v2"></a>

Por padrão, você não pode usar o cliente de criptografia Amazon S3 V2 para descriptografar objetos que foram criptografados com algoritmos de quebra de chave obsoletos ou esquemas criptográficos de conteúdo obsoletos.

Os seguintes algoritmos de empacotamento de chaves estão obsoletos:
+  `KMS` 
+  `AES_KEY_WRAP` 

E os seguintes esquemas de criptografia de conteúdo estão obsoletos:
+  `CBC` 
+  `CTR` 

Se você estiver usando clientes de criptografia antigos do Amazon S3 no AWS SDK para C\+\+ para criptografar os objetos, provavelmente está usando os métodos obsoletos se:
+ Você usou `SimpleEncryptionMaterials` ou `KMSEncryptionMaterials`.
+ Você usou `ENCRYPTION_ONLY` como `Crypto Mode` em sua configuração de criptografia.

Para usar o cliente de criptografia V2 do Amazon S3 para descriptografar objetos que foram criptografados por algoritmos de empacotamento de chaves ou esquemas de criptografia de conteúdo obsoletos, é necessário substituir o valor padrão de `SecurityProfile` na configuração de criptografia V2 de `V2` por `V2_AND_LEGACY`.

 **Exemplo** 

 *Pré-migração* 

```
auto materials = Aws::MakeShared<KMSEncryptionMaterials>("s3Encryption", CUSTOMER_MASTER_KEY_ID);
CryptoConfiguration cryptoConfig;
S3EncryptionClient encryptionClient(materials, cryptoConfig);
// Code snippet here to setup the getObjectRequest object.
encryptionClient.GetObject(getObjectRequest);
```

 *Pós-migração* 

```
auto materials = Aws::MakeShared<KMSWithContextEncryptionMaterials>("s3EncryptionV2", CUSTOMER_MASTER_KEY_ID);
CryptoConfigurationV2 cryptoConfig(materials);
cryptoConfig.SetSecurityProfile(SecurityProfile::V2_AND_LEGACY);
S3EncryptionClientV2 encryptionClient(cryptoConfig);
// Code snippet here to setup the getObjectRequest object.
encryptionClient.GetObject(getObjectRequest);
```

### Descriptografar objetos com alcance
<a name="decrypt-objects-with-range-v1-v2"></a>

Com clientes de criptografia legados do Amazon S3, você pode especificar um intervalo de bytes a serem recebidos ao descriptografar um objeto do S3. No cliente de criptografia V2 do Amazon S3, esse recurso é `DISABLED` por padrão. Portanto, você precisa substituir o valor padrão de `DISABLED` de `ALL` por `RangeGetMode` na configuração da criptografia V2.

 **Exemplo** 

 *Pré-migração* 

```
auto materials = Aws::MakeShared<KMSEncryptionMaterials>("s3Encryption", CUSTOMER_MASTER_KEY_ID);
CryptoConfiguration cryptoConfig;
S3EncryptionClient encryptionClient(materials, cryptoConfig);
// Code snippet here to setup the getObjectRequest object.
getObjectRequest.WithRange("bytes=38-75");
encryptionClient.GetObject(getObjectRequest);
```

 *Pós-migração* 

```
auto materials = Aws::MakeShared<KMSWithContextEncryptionMaterials>("s3EncryptionV2", CUSTOMER_MASTER_KEY_ID);
CryptoConfigurationV2 cryptoConfig(materials);
cryptoConfig.SetUnAuthenticatedRangeGet(RangeGetMode::ALL);
S3EncryptionClientV2 encryptionClient(cryptoConfig);
// Code snippet here to setup the getObjectRequest object.
getObjectRequest.WithRange("bytes=38-75");
encryptionClient.GetObject(getObjectRequest);
```

### Descriptografar objetos com qualquer CMK
<a name="decrypt-objects-with-any-cmk-v1-v2"></a>

Ao descriptografar objetos que foram criptografados com `KMSWithContextEncryptionMaterials`, os clientes de criptografia V2 do Amazon S3 podem permitir que o KMS encontre a CMK adequada fornecendo uma chave mestra vazia. Esse recurso está `DISABLED` por padrão. Você precisa configurá-lo explicitamente chamando `SetKMSDecryptWithAnyCMK(true)` para seus materiais de criptografia do KMS.

 **Exemplo** 

 *Pré-migração* 

```
auto materials = Aws::MakeShared<KMSEncryptionMaterials>("s3Encryption", ""/* provide an empty KMS Master Key*/);
CryptoConfiguration cryptoConfig;
S3EncryptionClient encryptionClient(materials, cryptoConfig);
// Code snippet here to setup the getObjectRequest object.
encryptionClient.GetObject(getObjectRequest);
```

 *Pós-migração* 

```
auto materials = Aws::MakeShared<KMSWithContextEncryptionMaterials>("s3EncryptionV2", ""/* provide an empty KMS Master Key*/);
materials.SetKMSDecryptWithAnyCMK(true);
CryptoConfigurationV2 cryptoConfig(materials);
S3EncryptionClientV2 encryptionClient(cryptoConfig);
// Code snippet here to setup the getObjectRequest object.
encryptionClient.GetObject(getObjectRequest);
```

Para acessar o código completo de todos esses cenários de migração, consulte [Amazon S3 Encryption example](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3encryption) no Github.