如果我想在2分钟内为每个对象创建1000个预签名的url,是否对每个对象的预签名网址的数量有任何限制。这是有效的场景吗?
发布于 2014-07-23 03:46:41
您可以根据需要创建任意数量的签名URL。然而,根据您的动机和策略,对于完全相同的对象,唯一预签名URL的数量存在实际限制。
S3 (在2014年前首次部署的S3区域)支持V2和V4两种身份验证算法,由于算法非常不同,签名的urls看起来非常不同。
在V2中,如果由相同的亚马逊网络服务密钥签名,那么在给定的过期时间内签名的网址看起来总是一样的。
如果您对对象的url进行签名,将其设置为在一分钟后过期...并立即重复该过程,两个签名的URL将是相同的。
接下来,恰好一秒后,为同一个对象签名一个url,该URL将在未来59秒后过期,并且新签名的URL也将是相同的。
为什么?因为在V2中,过期时间是以协调世界时为单位的绝对时钟时间,当您实际生成签名的URL时,历史记录中的特定时间不会更改任何内容。
V4是不同的。在上面的场景中,前两个仍然是相同的,但第二个不是,因为V4身份验证包括您创建签名url的日期和时间,或者您说您创建的日期和时间。过期时间是相对于签名时间的,而不是绝对的。
请注意,这两种形式的已签名url都是防篡改的--过期时间嵌入在URL中,但是试图在签名后对其进行调整将使签名无效并使其无用。
如果需要为同一对象生成大量带签名的urls,则需要递增每次签名尝试的过期时间,以便获得唯一值。(编辑:或者不是,如果你觉得聪明的话...见下文)。
我还想到,您可能认为S3在签名过程中扮演着积极的角色,但事实并非如此,这一切都是在您的本地代码中完成的。
在任何意义上,S3都不知道您生成的签名urls,除非或直到它们被使用。当经过签名的请求到达时,S3会执行与您的代码完全相同的操作--它规范化请求的某些属性,并生成签名。然后,在给定完全相同的参数的情况下,将它生成的内容与您的代码应该生成的内容进行比较。如果他们生成的签名与您提供的签名匹配(并且您使用的密钥具有执行请求操作的权限),则请求成功。
更新:事实证明,有一种非官方的机制允许您在签名过程中嵌入额外的“熵”,为相同的对象和过期时间生成唯一的、每个用户(例如)签名的URL。
在V2身份验证下,它通常不希望您在签名逻辑中包含非S3特定的参数,它看起来既像是一个bug,也是一个特性……将&x-amz-meta-{anything-here}={unique-value-here}
查询字符串参数添加到您的网址。这些参数在PUT
请求中用作标头,但在GET
请求中没有意义,但是,如果存在,S3仍然要求将它们包括在签名计算中,即使参数键和值最终将被S3...但添加的值是防篡改的,在不使签名无效的情况下不能被恶意删除或更改。
同样的机制也适用于V4,尽管是出于不同的原因。
发布于 2017-11-09 06:53:10
公认的答案现在已经过时了。对于未来的观众来说,没有必要包括任何额外的标题,因为现在亚马逊网络服务在每个签名的url中都包含了一个Signature
字段,每次您提出请求时都是不同的。
发布于 2014-07-22 20:03:23
是。事实上,我相信亚马逊网络服务甚至不能限制这一点,因为在S3上没有这样的API调用。URL签名完全由SDK完成。
但是,如果创建这么多的URL是一个好主意,或者不是一个完全依赖于上下文的想法...
https://stackoverflow.com/questions/24896743
复制相似问题