Encriptación y descifrado de datos con recuperación ante desastres entre regiones
Escenario
Si se produce una falla durante la encriptación o el descifrado en una región, puede utilizar KMS para implementar la encriptación y el descifrado de recuperación ante desastres entre regiones, lo que garantiza la continuidad del servicio.
Solución
Si KMS presenta fallas en una o varias regiones, la encriptación y el descifrado se pueden completar siempre que haya disponible una clave en el anillo de claves.
Un anillo de claves entre regiones puede utilizar las CMK de varias regiones para cifrar un dato y generar texto cifrado de datos único. Para descifrar los datos, basta con utilizar un anillo de claves que contenga una o más CMK disponibles que se utilizaron para cifrar los datos.
Para obtener más información, consulte Detalles.
Proceso
Procedimiento
- Obtenga las AK y SK.
- ACCESS_KEY: Clave de acceso de la cuenta de Huawei. Para obtener más detalles, consulte ¿Cómo obtengo una clave de acceso (AK/SK)?
- SECRET_ACCESS_KEY: Clave de acceso secreta de la cuenta de Huawei. Para obtener más detalles, consulte ¿Cómo obtengo una clave de acceso (AK/SK)?
- Habrá riesgos de seguridad si la AK/SK utilizada para la autenticación se escribe directamente en el código. Cifre la AK/SK en el archivo de configuración o en las variables de entorno para su almacenamiento.
- En este ejemplo, las AK/SK almacenadas en las variables de entorno se utilizan para la autenticación de identidad. Primero configure las variables de entorno HUAWEICLOUD_SDK_AK y HUAWEICLOUD_SDK_SK en el entorno local.
- Obtenga información de la región.
- Inicie sesión en la consola de gestión.
- Pase el ratón por encima del nombre de usuario en la esquina superior derecha y seleccione My Credentials en la lista desplegable.
- Obtenga los Project ID y Project Name.
Figura 1 Obtención del ID y el nombre del proyecto
- Haga clic en . Elija .
- Obtenga el ID de la CMK (KEYID) que se utilizará en la región actual.
Figura 2 Obtención del ID de CMK
- Utilice el anillo de claves para encriptar y desencriptar.
public class KmsEncryptionExample { private static final String ACCESS_KEY = System.getenv("HUAWEICLOUD_SDK_AK"); private static final String SECRET_ACCESS_KEY = System.getenv("HUAWEICLOUD_SDK_SK"); private static final String PROJECT_ID_1 = "<projectId1>"; private static final String REGION_1 = "<region1>"; private static final String KEYID_1 = "<keyId1>"; public static final String PROJECT_ID_2 = "<projectId2>"; public static final String REGION_2 = "<region2>"; public static final String KEYID_2 = "<keyId2>"; // Data to be encrypted private static final String PLAIN_TEXT = "Hello World!"; public static void main(String[] args) { // CMK list List<KMSConfig> kmsConfigList = new ArrayList<>(); kmsConfigList.add(new KMSConfig(REGION_1, KEYID_1, PROJECT_ID_1)); kmsConfigList.add(new KMSConfig(REGION_2, KEYID_2, PROJECT_ID_2)); // Construct encryption-related information. HuaweiConfig multiConfig = HuaweiConfig.builder().buildSk(SECRET_ACCESS_KEY) .buildAk(ACCESS_KEY) .buildKmsConfig(kmsConfigList) .buildCryptoAlgorithm(CryptoAlgorithm.AES_256_GCM_NOPADDING) .build(); // Select a key ring. KMSKeyring keyring = new KmsKeyringFactory().getKeyring(KeyringTypeEnum.KMS_MULTI_REGION.getType()); HuaweiCrypto huaweiCrypto = new HuaweiCrypto(multiConfig).withKeyring(keyring); // Encryption context Map<String, String> encryptContextMap = new HashMap<>(); encryptContextMap.put("key", "value"); encryptContextMap.put("context", "encrypt"); // Encryption CryptoResult<byte[]> encryptResult = huaweiCrypto.encrypt(new EncryptRequest(encryptContextMap, PLAIN_TEXT.getBytes(StandardCharsets.UTF_8))); // Decryption CryptoResult<byte[]> decryptResult = huaweiCrypto.decrypt(encryptResult.getResult()); Assert.assertEquals(PLAIN_TEXT, new String(decryptResult.getResult())); } }