Расчет подписи REST API Amazon s3 Test Suite - PullRequest
0 голосов
/ 17 октября 2018

Я работаю над внедрением 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 - двоичное значение результата для последнего обработанного кода.Это преобразуется в шестнадцатеричное, и все пустое пространство удаляется, а строка преобразуется в нижний регистр.Это не возвращает подпись, как показано в наборе тестов.

Если есть надежда, что кто-то может помочь.

...