AwsCrypto线程安全吗?我们可以一次创建一个AWSCrypto对象并将其用于所有请求吗?

时间:2019-09-27 06:31:00

标签: aws-sdk aws-kms

我们可以只创建一次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());
}

1 个答案:

答案 0 :(得分:1)

AWSCrypto是线程安全的,但setEncryptionAlgorithm和setEncryptionFrameSize除外。只要使用该对象的每个线程都可以更改状态,就可以安全地从多个线程调用这两种方法。如果一个线程在没有其他线程准备的情况下进行更改,就会有麻烦。