繁体   English   中英

使用 AWS S3 KMS 加密时如何确保您的文件已加密?

[英]How to make sure your files are encrypted when using AWS S3 KMS encryption?

我正在尝试使用 AWS S3 和 AWS java SDK(同时尝试 v1 和 v2)测试有关加密/解密的最基本用例。

所以这就是我正在做的事情:

  1. 我使用 aws 控制台上传了一个小的 json 文件,然后在“属性”>“地穴”中检查是否选择了“AWS-KMS”并选择了我的密钥别名。 我假设这告诉我文件是用我的密钥加密的,但我无法检查这一点,因为如果我尝试使用 aws 控制台打开文件,它是明文形式的。

  2. 我尝试使用各种方法下载文件,我希望在使用最基本的方法时得到一个加密文件。

所以通过使用这个客户端(sdk v2):

  @Bean
  public S3Client s3Clientv2(AppProperties appProperties, CustomAwsCredentialsProvider customAwsCredentialsProvider) {

    return S3Client.builder()
        .httpClientBuilder(httpClientBuilder)
        .credentialsProvider(customAwsCredentialsProvider)
        .region(Region.EU_WEST_3)
        .build();

  }

这个下载方法:

  public void downloadFile(String bucket, String key) {    
    s3Client.getObject(GetObjectRequest.builder().bucket(bucket).key(key).build(), ResponseTransformer.toFile(Paths.get("test_aws.json")));    
  }

我希望得到一个加密文件,但事实并非如此。

然后我尝试使用能够自行“加密/解密”的客户端“使用此客户端从 Amazon S3 获得的任何对象都会自动解密”来源: https://docs.aws.amazon.com/en_pv/sdk-for -java/v1/developer-guide/examples-crypto-kms.html

AmazonS3Encryption s3Encryption = AmazonS3EncryptionClientBuilder
        .standard()
        .withRegion(Regions.US_WEST_2)
        .withCryptoConfiguration(new CryptoConfiguration(CryptoMode.EncryptionOnly).withAwsKmsRegion(Region.getRegion(Regions.US_WEST_2)))
        // Can either be Key ID or alias (prefixed with 'alias/')
        .withEncryptionMaterials(new KMSEncryptionMaterialsProvider("alias/s3-kms-key"))
        .build();

但是使用:

S3Object file = s3Encryption.getObject(new GetObjectRequest(bucket, key));

使用此客户端调用会收到警告:“无法检测存储桶 '%s' 中 object '%s' 的加密信息。返回 object 而不解密。”

  • 那么我在这里做错了什么?
  • 如何检查我的文件是否真的加密?
  • 在没有“文件未加密”警告的情况下下载和解密它的正确配置是什么?

更新:当然,我已经检查了 object 元数据,其中确实包含 KMS 信息和 KMS 密钥 ID,但加密客户端期待有关此的一些其他信息:

/** Initialization vector (IV) header that is used in the symmetric and envelope encryption mechanisms */
public static final String CRYPTO_IV = "x-amz-iv";

和这个:

/**
 * Encrypted symmetric key header that is used in the Encryption Only (EO) envelope
 * encryption mechanism.
 */
public static final String CRYPTO_KEY = "x-amz-key";

好的,我想我明白了:我对服务器端加密和客户端加密感到困惑。

所以 AmazonS3Encryption 客户端只是关于客户端加密 当您使用服务器端加密时,对文件的任何访问都会对其进行解密。

所以我的问题的答案是:如果您需要对加密进行细粒度控制,并能够下载仍然加密的内容,请禁用服务器端加密并使用客户端加密。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM