Amazon Web Services
一般参考 (Version 1.0)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

任务 3:为 AWS Signature 版本 4 计算签名

在计算签名之前,从 AWS 秘密访问密钥派生出签名密钥。由于派生签名密钥特定于日期、服务和区域,因此它提供了更高程度的保护。秘密访问密钥不只用于对请求进行签名。然后将签名密钥和您在任务 2:创建签名版本 4 的待签字符串中创建的待签字符串用作加密哈希函数的输入。加密哈希函数生成的十六进制编码结果就是签名。

签名版本 4 不需要您使用特定字符编码来对待签字符串进行编码。不过,一些 AWS 服务可能需要特定编码。有关更多信息,请参阅该服务的文档。

计算签名

  1. 派生您的签名密钥。为此,请使用您的秘密访问密钥创建一系列基于哈希的消息身份验证代码 (HMAC)。此代码显示在以下伪代码中,其中 HMAC(key, data) 表示以二进制格式返回输出的 HMAC-SHA256 函数。每个哈希函数的结果将成为下一个函数的输入。

    用于派生签名密钥的伪代码

    Copy
    kSecret = your secret access key kDate = HMAC("AWS4" + kSecret, Date) kRegion = HMAC(kDate, Region) kService = HMAC(kRegion, Service) kSigning = HMAC(kService, "aws4_request")

    请注意,哈希过程中所使用的日期的格式为 YYYYMMDD(例如,20150830),不包括时间。

    确保以正确的顺序为您要使用的编程语言指定 HMAC 参数。在此示例中,密钥是第一个参数,数据 (消息) 是第二个参数,但您使用的函数可能以不同顺序指定密钥和数据。

    使用摘要 (二进制格式) 来派生密钥。大多数语言都有用来计算二进制格式哈希(通常称为摘要)或十六进制编码哈希(称为十六进制摘要)的函数。派生密钥需要使用二进制格式摘要。

    以下示例显示了用于派生签名密钥的输入以及所生成的输出,其中 kSecret = wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY

    该示例使用与任务 1 和任务 2 中的请求相同的参数 (对 IAM 的请求,位于 cn-north-1 区域,2015 年 8 月 30 日)。

    示例输入

    Copy
    HMAC(HMAC(HMAC(HMAC("AWS4" + kSecret,"20150830"),"cn-north-1"),"iam"),"aws4_request")

    以下示例显示了此 HMAC 哈希操作序列生成的派生签名密钥。这说明了此二进制签名密钥中每个字节的十六进制表示形式。

    示例签名密钥

    Copy
    3fa8337361355535220160ce57f4cb5b8e318209aa7bb03ecdcb9aaeec3d07a2

    有关如何在不同编程语言中派生签名密钥的更多信息,请参阅说明如何为 Signature 版本 4 派生签名密钥的示例

  2. 计算签名。要计算签名,请使用派生的签名密钥和待签字符串作为加密哈希函数的输入。在计算签名后,将二进制值转换为十六进制表示形式。

    以下伪代码说明如何计算签名。

    Copy
    signature = HexEncode(HMAC(derived signing key, string to sign))

    以下示例显示了使用与任务 2 中相同的签名密钥和待签字符串会生成的签名:

    示例签名

    Copy
    d37af66cc90dc26bb2e27d2a97316b729b82589b5e4648f1ae34cb83a3f546cd