2

我正在使用 Amazon aws Java SDK 进行编码。

我已经使用 SSE-C(使用客户提供的密钥的服务器端加密)将我的一些本地文件上传到 S3,而没有使用任何加密的文件很少。在其他模块中下载文件之前,我需要确保该特定文件是否已加密。我已经提到了这个链接。但此过程适用于使用 SSE(与 SSE-C 不同)加密的文件。在参考了 Amazon aws Java API 之后,我编写了以下代码。

Base64 b = new Base64();
byte[] keyBytes = b.decode("encryptionKey");
SecretKey key = new SecretKeySpec(keyBytes,0,keyBytes.length,"AES");
SSECustomerKey sseKey = new SSECustomerKey(key);

GetObjectMetadataRequest request2 =new GetObjectMetadataRequest("bucketname","keyname").withSSECustomerKey(sseKey);
ObjectMetadata metadata = s3client.getObjectMetadata(request2);
System.out.println("Encryption algorithm used: " + metadata.getSSECustomerAlgorithm());

上面的代码可以正常下载加密文件。但是在下载未加密的文件时出现异常。

是否有任何通用 API 来获取加密和非加密文件的元数据。

4

2 回答 2

1

你可以在之前运行检查,如果getSSECustomerKey返回null,你知道它没有被加密,比如

GetObjectMetadataRequest request2 = new GetObjectMetadataRequest("bucketname","keyname");
ObjectMetadata metadata = s3client.getObjectMetadata(request2);

if (metadata.getSSEAlgorithm() == null) {
    // download files directly - it is not encrypted
} else {
    // files encrypted - add the SSE key
}

另一种选择是检查异常并在异常中处理非加密文件的下载,检查文件是否存在并进行下载。

于 2016-11-18T08:07:11.337 回答
1

使用 SSE-C 时的一般指导是分别存储 S3 对象和使用的加密密钥之间的映射(虽然不是密钥本身)。此映射可以存储在数据库(RDS、Dynamo 甚至 SimpleDB)中。或者它甚至可以在 S3 中:将文件存储在.../metadata/<object>包含密钥 ID 或“NONE”的路径中,并在尝试获取实际文件之前读取它。

这样做的一个原因是支持多个客户密钥。由于密钥轮换策略,您可能需要从一个密钥逐渐过渡到另一个密钥,或者决定为每个客户使用不同的密钥。这样,您的应用就可以支持任何这些场景。

于 2016-11-20T23:21:57.353 回答