我正在努力在我们的应用程序中实现Amazon REST API。该应用程序是使用WinDev构建的。为了也测试我的签名计算,我决定尝试亚马逊提供的测试套件: https://docs.aws.amazon.com/general/latest/gr/signature-v4-test-suite.html
这是我如何得出规范请求的十六进制值的方法:
{
"cmd": ["make", "&&", "start", "cmd", "/c", "${file_path}/${file_base_name}.exe"],
"file_regex": "^(..[^:\n]*):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "${folder:${project_path:${file_path}}}",
"selector": "source.makefile",
"syntax": "Packages/Makefile/Make Output.sublime-syntax",
"keyfiles": ["Makefile", "makefile"],
"shell": true,
"variants":
[
{
"name": "Clean",
"shell_cmd": "make clean"
}
]
}
方法HashCanoncialRequest删除所有字符10(这样做是为了正确地对字符串进行哈希处理),使用windev的hashstring函数将字符串哈希为二进制。该二进制函数被转换为十六进制值,所有空白都被删除并更改为小写。
sCanonicalRequestHash = :HashCanonicalRequest([
GET
/
Param1=value1&Param2=value2
host:example.amazonaws.com
x-amz-date:20150830T123600Z
host;x-amz-date
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
])
这将产生以下值: 816cd5b414d056048ba4f7c5386d6e0533120fb1fcfa93762cf0fc39e2cf19e0
这是测试套件期望的值。到目前为止,一切都很好。
接下来是要签名的字符串,如下所示:
//Remove char 13 ,otherwise the hash fails( Windows enter )
sResult = Replace(sResult, Charact(13), "")
//Create hash
sResult = HashString(HA_SHA_256, sResult)
//Convert hash to lower case hex
sResult = Lower(BufferToHexa(sResult, 1, 32))
//Remove spaces
sResult = Replace(sResult," ", "")
现在是时候计算签名密钥了。 首先测试套件提供的一些值:
AWS4-HMAC-SHA256
20150830T123600Z
20150830/us-east-1/service/aws4_request
816cd5b414d056048ba4f7c5386d6e0533120fb1fcfa93762cf0fc39e2cf19e0
现在计算:
sSecret is string = "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY"
sDate is string = "20150830"
sRegion is string = "us-east-1"
Amazon也提供了不同的测试,以便也在此处检查您的计算,该计算经过测试并返回预期值。
现在不执行测试套件所期望的部分。签名计算。
bufDateKey is Buffer = WL.HashString(HA_HMAC_SHA_256, sDate, "AWS4" + sSecret)
bufRegionKey is Buffer = WL.HashString(HA_HMAC_SHA_256, sRegion, bufDateKey)
bufServiceKey is Buffer = WL.HashString(HA_HMAC_SHA_256, "service", bufRegionKey)
bufSigningKey is Buffer = WL.HashString(HA_HMAC_SHA_256, "aws4_request", bufServiceKey)
ss是要签名的字符串的字符串值,如第三个代码片段所示 bufSigningKey是最后一个代码片段的结果的二进制值。这将转换为十六进制,并删除所有空白,并将字符串转换为小写。这不会返回测试套件所示的签名。
如果希望有人可以提供帮助。