如何解密使用 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 加密”是什么意思。也许您的意思是“静态加密”?
我按照 部分 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 加密”是什么意思。也许您的意思是“静态加密”?