2017-09-12 100 views
0

本文在AWS开发者博客介绍了如何生成,将在服务器端进行加密S3文件前签署的网址:https://aws.amazon.com/blogs/developer/generating-amazon-s3-pre-signed-urls-with-sse-kms-part-2/。描述如何生成url的部分是有道理的,但接下来文章将继续描述如何在put请求中使用url,并且它说除了生成的url之外,还必须添加到http请求中指定加密算法的头部。为什么在加密算法包含在url代中时这是必要的?为什么我们必须在http头中指定服务器端加密?

// Generate a pre-signed PUT URL for use with SSE-KMS 
GeneratePresignedUrlRequest genreq = new GeneratePresignedUrlRequest(
    myExistingBucket, myKey, HttpMethod.PUT) 
    .withSSEAlgorithm(SSEAlgorithm.KMS.getAlgorithm()); 

... 

HttpPut putreq = new HttpPut(URI.create(puturl.toExternalForm())); 
putreq.addHeader(new BasicHeader(Headers.SERVER_SIDE_ENCRYPTION, 
    SSEAlgorithm.KMS.getAlgorithm())); 

我问一部分是由于好奇,也因为有从生成URL中的一个执行不同的机器上我的情况PUT请求正在运行的代码。我不会详细讨论,但确保一台机器生成的标题与另一台机器生成的url相匹配是一件非常麻烦的事情。

回答

0

我不知道该如何辩解“清”是的,但我的假设是,需要加密的参数为头,以防止它们出现在该日志查询字符串日志发送。

当加密算法被包含在URL中的一代

这方面是比较容易回答为什么这是必要的。经过签名的请求是一种向系统证明拥有访问密钥的人员对这个确切的特定请求进行了授权,直至最后一个字节。更改任何有关被列入签名生成的请求,并且您已经无效签名,因为现在要求从什么是授权不同。

当S3收到您的请求时,它看起来你的密钥,并做你的本地代码做什么...它签署收到这个请求,并检查其产生的签名是否与您所提供的一个。

一个常见的误解是,签署网址由服务产生的,但事实并非如此。签名的URL完全在本地生成。该算法对于反向工程来说在计算上是不可行的,并且对于任何给定的请求,确切地有1个可能的有效签名。

0

它看起来像关于加密的信息不会被包含在URL presigned。我猜测它包含在GeneratePresignedUrlRequest中的唯一原因是生成一个经过验证的哈希。在阅读了关于何时使用url参数和自定义标题的问题之后,我不得不怀疑在这里使用自定义标题而不是url参数是否有明确的理由。正如原始问题中提到的那样,必须包含这些头文件使得使用此API变得困难。如果使用url参数,我不会遇到这个问题。任何意见关于这个问题将不胜感激。

相关问题