inj*_*joy 0 amazon-s3 access-keys amazon-web-services
为什么AccessKeyId包含在s3预签名URL中?真的有必要吗?预签名的URL已经包含该Signature字段,为什么还需要该字段AccessKeyId?不会是Signature足够的?
签名用于证明两件事:
重要的是...签名实际上不包含任何有意义的信息。是对还是错。
这是基于HMAC的公共(正在发出请求)和私有(秘密密钥)信息的哈希。该服务不会“解码”它,解释它或从中学习任何东西。
取而代之的是,服务(使用access-key-id)查找关联的密钥,¹接受请求;并在内部生成您应该为同一请求生成的签名...然后,它会检查您是否真正生成了该签名。²如果不是,则错误为SignatureDoesNotMatch。该错误不是更具体,因为任何时间任何给定请求的签名只有一个可能的值。任何其他签名就是错误的签名。
但是必须指定access-key-id,以便服务知道谁在发出请求。签名不包含任何可逆/可解码/可解密的信息。
¹ 查找使用Signature Version 4时,关联的秘密密钥可能过于简化,因为存在从IAM用户的秘密密钥派生的层(日期,区域,服务,签名)密钥...并且结构和嵌套暗示着各个服务只能访问他们需要的相关值。
² 您生成的是一个重要的短语,因为可能会误解预签名URL的来源。这些完全在您的代码中生成,而无需与服务进行交互。S3在实际使用任何预签名URL之前都不知道它们的存在。这具有有时可能有用的含义。例如,完全有可能为尚不存在的对象生成一个预签名URL,然后再创建该对象。此外,禁用或删除用于生成预签名URL的aws-access-key-id会立即使该密钥曾经生成的所有URL无效。