跨Region容灾加解密
应用场景
当单Region加解密出现服务侧故障时,无法再对数据进行加解密操作,用户可以通过密钥管理服务(Key Management Service,KMS)实现跨Region容灾加解密,保证业务不中断。
解决方案
当一个或多个Region的KMS服务出现故障,只要密钥环中存在一个可用的Region即可完成加解密。
跨Region密钥支持同时使用多个Region的主密钥对一个数据加密,生成唯一的数据密文。解密使用的密钥环,可以使用加密数据时相同的密钥环,也可以使用不同的密钥环,此时解密密钥环只需包含一个或多个加密密钥环中使用的可用的用户主密钥。
更多详情请访问:详情参考。
操作流程
操作步骤
- 获取AK/SK:
- 获取region相关信息。
- 登录管理控制台。
- 鼠标移动至右上方的用户名,在下拉列表中选择“我的凭证”。
- 获取“项目ID”(PROJECT_ID)和“项目”(REGION)。
图1 获取项目ID和项目
- 单击页面左侧,选择“密钥管理”界面。 ,默认进入
- 获取当前Region需要使用的主密钥ID(KEYID)。
图2 获取主密钥ID
- 使用密钥环加解密。
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>"; // 需要加密的数据 private static final String PLAIN_TEXT = "Hello World!"; public static void main(String[] args) { // 主密钥列表 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)); // 构建加密相关信息 HuaweiConfig multiConfig = HuaweiConfig.builder().buildSk(SECRET_ACCESS_KEY) .buildAk(ACCESS_KEY) .buildKmsConfig(kmsConfigList) .buildCryptoAlgorithm(CryptoAlgorithm.AES_256_GCM_NOPADDING) .build(); // 选择密钥环 KMSKeyring keyring = new KmsKeyringFactory().getKeyring(KeyringTypeEnum.KMS_MULTI_REGION.getType()); HuaweiCrypto huaweiCrypto = new HuaweiCrypto(multiConfig).withKeyring(keyring); // 加密上下文 Map<String, String> encryptContextMap = new HashMap<>(); encryptContextMap.put("key", "value"); encryptContextMap.put("context", "encrypt"); // 加密 CryptoResult<byte[]> encryptResult = huaweiCrypto.encrypt(new EncryptRequest(encryptContextMap, PLAIN_TEXT.getBytes(StandardCharsets.UTF_8))); // 解密 CryptoResult<byte[]> decryptResult = huaweiCrypto.decrypt(encryptResult.getResult()); Assert.assertEquals(PLAIN_TEXT, new String(decryptResult.getResult())); } }