为什么AccessKeyId包含在s3预签名URL中?

时间:2019-04-05 22:07:27

标签: amazon-web-services amazon-s3 access-keys

为什么s3预签名URL中包含AccessKeyId?真的有必要吗?预先签名的URL已经包含Signature字段,为什么还仍然需要AccessKeyIdSignature不够吗?

1 个答案:

答案 0 :(得分:3)

签名用于证明两件事:

  • 签名者授权此特定请求,并且
  • 签名者拥有与指定的访问密钥ID关联的秘密密钥。

重要的是,签名实际上并没有包含任何有意义的信息。是对还是错。

它是基于HMAC的公共(正在发出的请求)和私有(密钥)信息的哈希。该服务不会“解码”它,解释它或从中学习任何东西。

相反,该服务-使用access-key-id-查找关联的密钥,¹接受请求;并在内部为同一请求生成应已生成的签名...然后它会检查您是否真正生成了该签名。²如果不是,则错误为SignatureDoesNotMatch。该错误不是更具体,因为任何时间任何给定请求的签名只有一个可能的值。其他任何签名就是错误的签名。

但是必须指定access-key-id,以便服务知道谁在发出请求。签名不包含任何可逆/可解码/可解密的信息。


在使用签名版本4时,

¹查找关联的秘密密钥可能是一个过分的简化,因为存在从IAM用户的秘密密钥派生的(日期,区域,服务,签名)密钥层。 。以及结构和嵌套意味着各个服务只能访问其所需的相关值。

²您生成的是一个重要的短语,因为可能会误解预签名URL的来源。这些完全在您的代码中生成,而无需与服务进行交互。 S3在实际使用任何预签名URL之前都不知道它们的存在。这具有有时可能有用的含义。例如,完全有可能为尚不存在的对象生成一个预签名URL,然后再创建该对象。另外,禁用或删除用于生成预签名URL的aws-access-key-id会立即使该密钥曾经生成的所有URL失效。