我们可以只创建一次AwsCrypto对象并将其重用于所有请求吗?基本上,我想用KMSClient
创建一个AwsCrypto
,它可以用于多个CMKs
的加密和解密。
下面是示例代码:
public class KMSClient {
final private AwsCrypto awsCrypto;
final private Map<String, KmsMasterKeyProvider> kmsMasterKeyProviderMap;
public KMSClient(AwsCrypto awsCrypto){
this.awsCrypto = awsCrypto;
this.kmsMasterKeyProviderMap = new HashMap<>();
}
public byte[] encrypt(final byte[] data, final String customerManagedKeyId) {
return awsCrypto.encryptData(getKmsMasterKeyProvider(customerManagedKeyId), data).getResult();
}
public byte[] decrypt(final byte[] data, final String customerManagedKeyId) {
return awsCrypto.decryptData(getKmsMasterKeyProvider(customerManagedKeyId), data).getResult();
}
private KmsMasterKeyProvider getKmsMasterKeyProvider(final String customerManagedKeyId){
return kmsMasterKeyProviderMap.computeIfAbsent(customerManagedKeyId,
k -> KmsMasterKeyProvider.builder().withKeysForEncryption(k).build());
}
答案 0 :(得分:1)
AWSCrypto是线程安全的,但setEncryptionAlgorithm和setEncryptionFrameSize除外。只要使用该对象的每个线程都可以更改状态,就可以安全地从多个线程调用这两种方法。如果一个线程在没有其他线程准备的情况下进行更改,就会有麻烦。