Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在从AmazonS3下载文件之前,如何确保文件已使用SSE-C加密?_Java_Amazon Web Services_Encryption_Amazon S3_Aws Java Sdk - Fatal编程技术网

Java 在从AmazonS3下载文件之前,如何确保文件已使用SSE-C加密?

Java 在从AmazonS3下载文件之前,如何确保文件已使用SSE-C加密?,java,amazon-web-services,encryption,amazon-s3,aws-java-sdk,Java,Amazon Web Services,Encryption,Amazon S3,Aws Java Sdk,我正在使用Amazon aws Java SDK进行编码 我使用SSE-C(使用客户提供的密钥进行服务器端加密)将我的一些本地文件上载到S3,没有使用任何加密的文件也很少。在下载其他模块中的文件之前,我需要确保该特定文件是否加密。我已经提到这一点。但此过程适用于使用SSE加密的文件(与SSE-C不同)。在参考AmazonAWSJavaAPI之后,我编写了以下代码 Base64 b = new Base64(); byte[] keyBytes = b.decode("encryptionKey"

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

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

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来获取加密文件和非加密文件的元数据。

您可以在之前运行检查,如果
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
}

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

使用SSE-C时的一般指导是单独存储S3对象与使用的加密密钥(而不是密钥本身)之间的映射。这种映射可以存储在数据库中(RDS、Dynamo,甚至SimpleDB)。或者它甚至可以在S3中:将文件存储在包含密钥ID或“无”的路径(如
../metadata/
)中,并在尝试获取实际文件之前读取该路径


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

您不需要密钥来检索元数据,因为文档中说元数据没有加密。如果您删除
。使用安全客户密钥(SSECEY)
部分,是否有效?如果删除加密密钥部分,我会收到错误的请求400。嗯,我想您需要SSEC密钥,即使是元数据。因此,您需要捕获异常并使用/不使用密钥重试,或者想出其他方法记录哪些文件被加密。谢谢Henri。但它不适用于SSE-C。如果加密是服务器端加密(SSE),则您所解释的过程可以工作,其中密钥存储在服务器本身。但我的情况不同。要从S3获取元数据本身,我需要提供encryption key.hum。。然后,您可能需要处理异常,如果您可以下载不带加密密钥的文件,则在触发异常时运行检查