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