AWS 签名如何深入工作

信息安全 验证 休息 hmac
2021-08-20 01:11:51

我试图了解 AWS 签名 4 的工作原理。我阅读了文档,发现了一个计算签名的Python 示例。我也遇到了这个答案,它稍微解释了 HMAC。

我很想知道 AWS 在服务器端做了什么来“相信”请求。

他们是否运行与示例相同的代码,但使用请求传递的参数设置日期,然后匹配两个哈希(HMAC 似乎以这种方式工作)?如果是这样,为什么请求中有这么多值和两步散列(我猜这与散列冲突有关)?

PS:由于该方法(HMAC)使用 ACCESS 和 SECRET 密钥作为密钥(它是对称密钥),因此只能在服务器端实现。由于可以轻松访问密钥,因此无法在移动应用程序中安全地完成此操作。有没有办法在“不太封闭”(与服务器相比)环境中这样做,例如客户端应用程序/移动/等。应用程序?

2个回答

通用的Amazon API 模型涉及以下步骤

  1. 使用所有元素构建您的 API 请求(在数组等程序结构中)
  2. 对请求元素进行排序和格式化
  3. 计算格式化请求的 HMAC
  4. 使用 HMAC 将完整请求发送到 Amazon

然后亚马逊接受请求,生成自己的 HMAC,如果匹配,它会验证请求(前提是您的身份验证令牌也匹配)。

如果您将密钥放在应用程序中,则无法确保您的安全。您将不得不强制任何已编译的客户端联系您的服务器并在那里执行 API 请求。

服务器端通过与客户端相同的过程来验证请求(+ 其他一些事情,例如检查时间/日期是否在实时的 15 分钟内)。如上所述创建派生签名密钥的优点是,只要日期匹配,现在可以多次使用此密钥来签署对同一区域和服务的请求。这对于节省一些计算或在不同组件中临时使用很有用。显然,您仍然希望采取措施保护派生密钥,但其损失的影响小于“真实”密钥的损失。

如果您的应用程序需要将对象上传到 S3,您可以使用预签名 URL 来避免将密钥传递给客户端: http: //docs.aws.amazon.com/AmazonS3/latest/dev/PresignedUrlUploadObject.html

否则,您可能希望在服务器上对访问密钥保密,并在客户端和服务器之间实施其他一些安全措施。