为什么AccessKeyId
包含在 s3 预签名 URL 中?真的有必要吗?预签名的 URL 已经包含该Signature
字段,为什么还需要该字段AccessKeyId
?还Signature
不够吗?
1 回答
签名用于证明两件事:
- 签名者授权此特定请求,并且
- 签名者拥有与指定的访问密钥 ID 关联的密钥。
重要的是……签名实际上并不包含任何有意义的信息。要么是对的,要么是错的。
它是基于 HMAC 的公共(发出的请求)和私有(密钥)信息的散列。该服务不会“解码”它或解释它或从中学习任何东西。
相反,服务——使用 access-key-id——查找相关的密钥,¹接受请求;并在内部生成您应该为同一请求生成的签名......然后它会检查这是否是您实际生成的。²如果不是,则错误为SignatureDoesNotMatch
. 该错误并不更具体,因为任何给定请求的签名在任何时候都只有一个可能的值。任何其他签名都只是错误的签名。
但是必须指定 access-key-id,以便服务知道谁在发出请求。签名不包含任何可逆/可解码/可解密信息。
¹在使用签名版本 4 时查找关联的密钥可能过于简单,因为有从 IAM 用户的密钥派生的(日期、区域、服务、签名)密钥层......并且结构和嵌套意味着单个服务只能访问他们需要的相关值。
²你生成的是一个重要的短语,因为可能会误解预签名 URL 的来源。这些完全在您的代码中生成,不与服务交互。在实际使用之前,S3 不知道任何预签名 URL 的存在。这具有有时可能有用的含义;例如,完全可以为一个尚不存在的对象生成一个预签名的 URL,然后再创建该对象。此外,禁用或删除用于生成预签名 URL 的 aws-access-key-id 会立即使该密钥生成的所有 URL 失效。