任务 3:为Amazon签名版本 4 计算签名
在计算签名之前,从 Amazon 秘密访问密钥派生出签名密钥。由于派生签名密钥特定于日期、服务和区域,因此它提供了更高程度的保护。秘密访问密钥不只用于对请求进行签名。然后将签名密钥和您在任务 2:创建签名版本 4 的待签字符串中创建的待签字符串用作加密哈希函数的输入。加密哈希函数生成的十六进制编码结果就是签名。
签名版本 4 不需要您使用特定字符编码来对待签字符串进行编码。不过,一些 Amazon 服务可能需要特定编码。有关更多信息,请参阅该服务的文档。
计算签名
-
派生您的签名密钥。为此,请使用您的秘密访问密钥创建一系列基于哈希的消息身份验证代码 (HMAC)。此代码显示在以下伪代码中,其中
HMAC(key, data)
表示以二进制格式返回输出的 HMAC-SHA256 函数。每个哈希函数的结果将成为下一个函数的输入。用于派生签名密钥的伪代码
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 中的请求相同的参数(2015 年 8 月 30 日对 IAM 的请求,位于
cn-north-1
区域)。示例输入
HMAC(HMAC(HMAC(HMAC("AWS4" + kSecret,"20150830"),"cn-north-1"),"iam"),"aws4_request")
以下示例显示了此 HMAC 哈希操作序列生成的派生签名密钥。这说明了此二进制签名密钥中每个字节的十六进制表示形式。
示例签名密钥
3fa8337361355535220160ce57f4cb5b8e318209aa7bb03ecdcb9aaeec3d07a2
有关如何在不同编程语言中派生签名密钥的更多信息,请参阅说明如何为签名版本 4 派生签名密钥的示例。
-
计算签名。要计算签名,请使用派生的签名密钥和待签字符串作为加密哈希函数的输入。在计算签名后,将二进制值转换为十六进制表示形式。
以下伪代码说明如何计算签名。
signature = HexEncode(HMAC(
derived signing key
,string to sign
))注意 确保以正确的顺序为您要使用的编程语言指定 HMAC 参数。在此示例中,密钥是第一个参数,数据 (消息) 是第二个参数,但您使用的函数可能以不同顺序指定密钥和数据。
以下示例显示了使用与任务 2 中相同的签名密钥和待签字符串会生成的签名:
示例签名
d37af66cc90dc26bb2e27d2a97316b729b82589b5e4648f1ae34cb83a3f546cd