像这个问题的人(AWS Signature Version 2 - can't reproduce signature from example)我无法运行AWS Signature版本2(https://docs.aws.amazon.com/general/latest/gr/signature-version-2.html)的示例。
我们有一个字符串:
GET\nelasticmapreduce.amazonaws.com\n/\nAWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Action=DescribeJobFlows&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2011-10-03T15%3A19%3A30&Version=2009-03-31
和示例密钥
wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
要独立于任何编程语言,请使用HmacSHA256计算的哈希在线工具:https://www.liavaag.org/English/SHA-Generator/HMAC/
但是我得到以下哈希值:
xgbYI2xegVYMVTvnhoqc8/opbN0v/5Pn+8i9usAQAjk=
可惜这不是期望值(此处未进行网址编码):
i91nKc4PWAt0JJIdXwz9HxZCJDdiy6cf/Mj6vPxyYIs=
我做错了什么?为什么我对哈希值的计算不正确?初始字符串正确吗?如果您设法通过在线工具获得正确的结果,请告诉我它是如何完成的。
答案 0 :(得分:3)
TLDR:是换行符
尽管某些工具和编程语言,尤其是那些基于C或起源于Unix的工具和编程语言(其中C被大量使用),将\n
视为换行符或表示,但该网页却没有。如果我在网页的“文本”模式下从您的Q输入字符串,它将计算HMAC值,该值包含反斜杠和小写字母“ en”,而不是AWS规范要求的换行符。
如果我以十六进制输入正确的输入(包含换行符),则为
4745540a656c61737469636d61707265647563652e616d617a6f6e6177732e636f6d0a2f0a4157534163636573734b657949643d414b4941494f53464f444e4e374558414d504c4526416374696f6e3d44657363726962654a6f62466c6f7773265369676e61747572654d6574686f643d486d6163534841323536265369676e617475726556657273696f6e3d322654696d657374616d703d323031312d31302d3033543135253341313925334133302656657273696f6e3d323030392d30332d3331
或在base64中为
R0VUCmVsYXN0aWNtYXByZWR1Y2UuYW1hem9uYXdzLmNvbQovCkFXU0FjY2Vzc0tleUlkPUFLSUFJT1NGT0ROTjdFWEFNUExFJkFjdGlvbj1EZXNjcmliZUpvYkZsb3dzJlNpZ25hdHVyZU1ldGhvZD1IbWFjU0hBMjU2JlNpZ25hdHVyZVZlcnNpb249MiZUaW1lc3RhbXA9MjAxMS0xMC0wM1QxNSUzQTE5JTNBMzAmVmVyc2lvbj0yMDA5LTAzLTMx
然后我得到正确的结果(您也应该如此)。