Я работаю над внедрением API Amazon REST в наше приложение.Приложение построено с WinDev.Чтобы тоже проверить мой расчет подписи, я решил попробовать набор тестов, предоставленный amazon: https://docs.aws.amazon.com/general/latest/gr/signature-v4-test-suite.html
Вот так я получаю шестнадцатеричное значение моего канонического запроса:
sCanonicalRequestHash = :HashCanonicalRequest([
GET
/
Param1=value1&Param2=value2
host:example.amazonaws.com
x-amz-date:20150830T123600Z
host;x-amz-date
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
])
Метод HashCanoncialRequest удаляет все символы char 10 (это делается для правильного хеширования строки), хэширует строку в двоичный файл с помощью функции хеш-строки windev.Эта двоичная функция преобразуется в шестнадцатеричное значение, все пробелы удаляются и изменяются на нижний регистр.
//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," ", "")
В результате получается следующее значение: 816cd5b414d056048ba4f7c5386d6e0533120fb1fcfa93762cf0fc39e2cf19e0
1011 Ожидаемое значение 1011тестирование.Все идет нормально.
Далее следует строка для подписи, она выглядит следующим образом:
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"
А теперь вычисление:
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)
Amazon предоставляет другой тест, чтобы тоже проверить свои вычисления здесь, и этот расчет проверени возвращает ожидаемое значение.
Теперь для части, которая не выполняет то, что ожидает набор тестов.Расчет подписи.
//Hashing the ss with psSigningKey as the key
bufSignature = WL.HashString(HA_HMAC_SHA_256, ss, bufSigningKey)
//Converting the hash to hex
bufSignature = BufferToHexa(bufSignature, 1, 32)
//Converting the hex value to lower case and remove any whitespace
bufSignature = Replace(Lower(bufSignature), " ", "")
ss - это строковое значение строки для подписи, как показано в третьем фрагменте кода. BufSigningKey - двоичное значение результата для последнего обработанного кода.Это преобразуется в шестнадцатеричное, и все пустое пространство удаляется, а строка преобразуется в нижний регистр.Это не возвращает подпись, как показано в наборе тестов.
Если есть надежда, что кто-то может помочь.