我正在使用Amazon aws Java SDK进行编码。
我使用SSE-C(服务器端加密,使用客户提供的密钥)上传了几个本地文件到S3,也有一些文件没有使用任何加密。在下载其他模块中的文件之前,我需要确保该特定文件是否已加密。我已经引用了这个link。但此过程适用于使用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来获取加密和非加密文件的元数据?
发布于 2016-11-18 16:07:11
您可以在之前运行检查,如果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-21 07:21:57
使用SSE-C时的一般指导原则是单独存储S3对象和所使用的加密密钥(而不是密钥本身)之间的映射。这个映射可以存储在数据库中(RDS、Dynamo,甚至SimpleDB)。或者甚至可以在S3中:在.../metadata/<object>这样的路径中存储一个包含密钥ID或"NONE“的文件,并在尝试获取实际文件之前读取该文件。
这样做的一个原因是为了支持多个客户密钥。由于密钥轮换策略,您可能需要逐步从一个密钥转换到另一个密钥,或者决定为每个客户使用不同的密钥。这样,您的应用程序就可以支持这些场景中的任何一种。
https://stackoverflow.com/questions/40671843
复制相似问题