如何解密使用 S3 REST API 加密的文件

How do I decrypt a file encrypted with S3 REST API

我按照 部分 official doc 中指定的方式对上传到 Amazon S3 的文件使用 REST 加密使用 REST API 添加 x-amz-server-side-encryption header 上传请求的值为 aws:kms

然后在Java这边,我使用下面的代码访问上传的文件:

private AmazonS3 client;
private String s3BucketName;
private String uploadedImportPathPrefix;

public Reader readFile(String storeId, String fileName) {
    String filePath = uploadedImportPathPrefix + "/" + storeId + "/" +  fileName;
    S3Object s3Object = client.getObject(s3BucketName, filePath);
    S3ObjectInputStream s3is = s3Object.getObjectContent();
    Reader reader = new InputStreamReader(s3is);
    return reader;
}

我还不清楚在Java端解密文件的方法。有什么建议吗?

我将使用适用于 Java V2(不是 V1 或 Rest)的 AWS SDK 来回答这个问题。这仍然会为您指明正确的方向。

要使用 KMS 解密从 Amazon S3 存储桶中检索到的数据,您需要用于加密数据的密钥 ID。这是一个显示此用例的 Java V2 示例:

// Decrypt the data passed as a byte array
  private static byte[] decryptData(byte[] data, String keyId) {

    try {
        KmsClient kmsClient = getKMSClient();
        SdkBytes encryptedData = SdkBytes.fromByteArray(data);

        DecryptRequest decryptRequest = DecryptRequest.builder()
                .ciphertextBlob(encryptedData)
                .keyId(keyId)
                .build();

        DecryptResponse decryptResponse = kmsClient.decrypt(decryptRequest);
        SdkBytes plainText = decryptResponse.plaintext();
        return plainText.asByteArray();

    } catch (KmsException e) {
        System.err.println(e.getMessage());
        System.exit(1);
    }
    return null;
}

用于 Java V2 example here 的完整 Amazon S3 和 KMS AWS SDK example here

使用 V1 时您仍然需要密钥 ID(这不是最佳做法)。

要下载使用 KMS 加密的 S3 对象,您需要获得对相关 KMS 密钥的 kms:Decrypt 权限。

这是一个政策示例:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "p1",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::mybucket/*"
      ]
    },
    {
      "Sid": "p2",
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt"
      ],
      "Resource": [
        "arn:aws:kms:region:123456789012:key/kms-key-id"
      ]
    }
  ]
}

PS 不确定“REST 加密”是什么意思。也许您的意思是“静态加密”?