

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.

# Migración del cliente de cifrado Amazon S3 (V1 a V2)
<a name="s3-encryption-migration-v1-v2"></a>

**nota**  
Si utiliza la versión 2 del cliente de cifrado Amazon S3 y desea migrar a la versión 3, consulte[Migración del cliente de cifrado Amazon S3 (V2 a V3)](s3-encryption-migration-v2-v3.md).

En este tema se muestra cómo migrar las aplicaciones de la versión 1 (V1) del cliente de cifrado Amazon Simple Storage Service (Amazon S3) a la versión 2 (V2) y cómo garantizar la disponibilidad de las aplicaciones durante todo el proceso de migración.

## Información general sobre la migración
<a name="migration-overview-v1-v2"></a>

Esta migración se produce en dos fases:

1. **Actualice los clientes existentes para leer nuevos formatos.** En primer lugar, implemente una versión actualizada de AWS SDK para C\+\+ en su aplicación. Esto permite a los clientes de cifrado de la versión V1 descifrar los objetos escritos por los nuevos clientes de la versión V2. Si su aplicación usa varios AWS SDKs, debe actualizar cada SDK por separado.

2. **Migue los clientes de cifrado y descifrado a la versión V2.** Una vez que todos sus clientes de cifrado de la versión 1 puedan leer los nuevos formatos, puede migrar los clientes de cifrado y descifrado existentes a sus respectivas versiones de la versión 2.

## Actualizar los clientes existentes para leer nuevos formatos
<a name="update-existing-clients-to-read-new-formats-v1-v2"></a>

Primero debe actualizar los clientes existentes a la versión más reciente del SDK. Tras completar este paso, los clientes V1 de su aplicación podrán descifrar los objetos cifrados por los clientes de cifrado V2 sin actualizar la base de código de la aplicación.

### Cree e instale la versión más reciente de AWS SDK para C\+\+
<a name="build-and-install-the-latest-version-of-the-sdk-cpp-v1-v2"></a>

 **Aplicaciones que utilizan el SDK desde el código fuente** 

Si compilas e instalas la fuente AWS SDK para C\+\+ desde la fuente, descarga o clona la fuente del SDK desde [`aws/aws-sdk-cpp`](https://github.com/aws/aws-sdk-cpp)una GitHub. Luego, repita los pasos de compilación e instalación normales.

Si vas AWS SDK para C\+\+ a actualizar desde una versión anterior a la 1.8.x, consulta este REGISTRO DE CAMBIOS para ver los [cambios más importantes](https://github.com/aws/aws-sdk-cpp/blob/master/CHANGELOG.md) introducidos en cada versión principal. Para obtener más información sobre cómo compilar e instalar, consulte. AWS SDK para C\+\+[Obtención AWS SDK para C\+\+ del código fuente](sdk-from-source.md)

 **Aplicaciones que utilizan el SDK desde Vcpkg** 

Si su aplicación utiliza [Vcpkg](https://github.com/microsoft/vcpkg) para realizar un seguimiento de las actualizaciones del SDK, simplemente use su método de actualización de Vcpkg existente para actualizar el SDK a la versión más reciente. Tenga en cuenta que hay un retraso entre el momento en que se publica una versión y el momento en que está disponible a través de un administrador de paquetes. La versión más reciente siempre está disponible en la [instalación desde el código fuente](sdk-from-source.md). 

Ejecute el siguiente comando para actualizar el paquete `aws-sdk-cpp`:

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

Y compruebe la versión del paquete `aws-sdk-cpp`:

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

La versión debe ser como mínimo la 1.8.24.

Para obtener más información sobre el uso de Vcpkg con AWS SDK para C\+\+, consulte. [Obtenerla AWS SDK para C\+\+ de un administrador de paquetes](sdk-from-pm.md)

### Compilación, instalación e implementación de sus aplicaciones
<a name="build-install-and-deploy-your-applications-v1-v2"></a>

Si su aplicación se enlaza de forma estática con el AWS SDK para C\+\+, no es necesario realizar cambios en el código de la aplicación, pero debe volver a compilarla para utilizar los cambios más recientes del SDK. Este paso no es necesario en el caso de la vinculación dinámica.

Tras actualizar la versión dependiente de la aplicación y comprobar su funcionalidad, proceda a implementar la aplicación en su flota. Una vez completada la implementación de la aplicación, puede pasar a la siguiente fase de migración de la aplicación para utilizar la versión V2 de los clientes de cifrado y descifrado.

## Migrar clientes de cifrado y descifrado a la versión V2
<a name="migrate-encryption-and-decryption-clients-to-v2-v1-v2"></a>

En los siguientes pasos, se muestra cómo migrar correctamente el código de la versión V1 a la V2 del cliente de cifrado de Amazon S3. Dado que es necesario realizar cambios en el código, tendrá que volver a crear la aplicación, independientemente de si se vincula estática o dinámicamente con ella. AWS SDK para C\+\+

### Uso de los nuevos materiales de cifrado
<a name="using-new-encryption-materials-v1-v2"></a>

Con los clientes de cifrado de Amazon S3 V2 y la configuración criptográfica V2, los siguientes materiales de cifrado han quedado obsoletos:
+  `SimpleEncryptionMaterials` 
+  `KMSEncryptionMaterials` 

Se han sustituido por los siguientes materiales de cifrado seguro:
+  `SimpleEncryptionMaterialsWithGCMAAD` 
+  `KMSWithContextEncryptionMaterials` 

Para crear un cliente de cifrado S3 V2, se requieren los siguientes cambios de código:
+   
**Si utiliza `KMSEncryptionMaterials` al crear un cliente de cifrado de S3:**  
  + Al crear un cliente de cifrado de S3 V2, sustituya `KMSEncryptionMaterials` por `KMSWithContextEncryptionMaterials` y especifíquelo en la configuración criptográfica V2.
  + Al colocar un objeto con clientes de cifrado de Amazon S3 V2, debe proporcionar de manera explícita un mapa de contexto de cadena-cadena como contexto de KMS para cifrar la CEK. Puede ser un mapa vacío.
+   
**Si utiliza `SimpleEncryptionMaterials` al crear un cliente de cifrado de S3:**  
  + Al crear un cliente de cifrado de Amazon S3 V2, sustituya `SimpleEncryptionMaterials` por `SimpleEncryptionMaterialsWithGCMAAD` y especifíquelo en la configuración criptográfica V2.
  + Al colocar un objeto con clientes de cifrado Amazon S3 V2, debe proporcionar de manera explícita un mapa de contexto de cadena-cadena; de lo contrario, el SDK devolverá un error.

 **Ejemplo: uso del algoritmo KMS/KMSWithContext Key Wrap** 

 *Antes de la migración (encapsulamiento de claves de 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);
```

 *Tras la migración (empaquetado de claves KMSWith contextuales)* 

```
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 */);
```

 **Ejemplo: uso del algoritmo de encapsulamiento de claves AES/AES-GCM** 

 *Antes de la migración (encapsulamiento de claves 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);
```

 *Después de la migración (encapsulamiento de claves 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 */);
```

## Ejemplos adicionales
<a name="additional-examples-v1-v2"></a>

Los ejemplos siguientes muestran cómo abordar casos prácticos específicos relacionados con la migración de la V1 a la V2.

### Descifrado de objetos cifrados por clientes de cifrado de Amazon S3 antiguos
<a name="decrypt-objects-encrypted-by-legacy-amazon-s3-encryption-clients-v1-v2"></a>

De forma predeterminada, no puede usar el cliente de cifrado Amazon S3 V2 para descifrar objetos que se cifraron con algoritmos de ajuste de claves obsoletos o esquemas criptográficos de contenido obsoletos.

Han quedado obsoletos los siguientes algoritmos de empaquetado de claves:
+  `KMS` 
+  `AES_KEY_WRAP` 

Y han quedado obsoletos los siguientes esquemas criptográficos de contenido:
+  `CBC` 
+  `CTR` 

Si utiliza clientes de cifrado de Amazon S3 antiguos AWS SDK para C\+\+ para cifrar los objetos, es probable que utilice los métodos obsoletos si:
+ Ha utilizado `SimpleEncryptionMaterials` o `KMSEncryptionMaterials`.
+ Ha utilizado `ENCRYPTION_ONLY` como `Crypto Mode` en su configuración criptográfica.

Para utilizar el cliente de cifrado Amazon S3 V2 para descifrar objetos cifrados mediante algoritmos de encapsulamiento de claves obsoletos o esquemas criptográficos de contenido obsoletos, debe anular el valor predeterminado de `SecurityProfile` en la configuración criptográfica V2 de `V2` a `V2_AND_LEGACY`.

 **Ejemplo** 

 *Antes de la migración* 

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

 *Después de la migración* 

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

### Descifrado de objetos con un rango
<a name="decrypt-objects-with-range-v1-v2"></a>

Con los clientes de cifrado de Amazon S3 antiguos, puede especificar el rango de bytes que se van a recibir al descifrar un objeto de S3. En el cliente de cifrado Amazon S3 V2, esta característica está configurada como `DISABLED` de manera predeterminada. Por lo tanto, debe anular el valor predeterminado de `RangeGetMode` de `DISABLED` a `ALL` en la configuración criptográfica de la versión 2.

 **Ejemplo** 

 *Antes de la migración* 

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

 *Después de la migración* 

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

### Descifrado de objetos con cualquier CMK
<a name="decrypt-objects-with-any-cmk-v1-v2"></a>

Al descifrar objetos que se han cifrado con `KMSWithContextEncryptionMaterials`, los clientes de cifrado de Amazon S3 V2 pueden permitir que KMS encuentre la CMK adecuada proporcionando una clave maestra vacía. Esta característica está configurada `DISABLED` como de forma predeterminada. Debe configurarla de forma explícita llamando a `SetKMSDecryptWithAnyCMK(true)` para sus materiales de cifrado de KMS.

 **Ejemplo** 

 *Antes de la migración* 

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

 *Después de la migración* 

```
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 obtener el código completo de todos estos escenarios de migración, consulte el [ejemplo de cifrado de Amazon S3](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3encryption) en GitHub.