Неверная подпись HMAC для вызова Amazon REST в WinRT

У Amazon есть несколько примеров подписания вызовов REST. с ХМАК. Однако при использовании следующего кода в приложении Metro/WinRT подписи не совпадают.

Метод расчета HMAC:

internal string CreateHMAC(
        string message,
        string algorithmName,
        string key)
    {
        MacAlgorithmProvider macAlgorithmProvider = MacAlgorithmProvider.OpenAlgorithm(algorithmName);
        var binaryMessage = CryptographicBuffer.ConvertStringToBinary(message, BinaryStringEncoding.Utf8);
        var binaryKeyMaterial = CryptographicBuffer.ConvertStringToBinary(key, BinaryStringEncoding.Utf8);
        var hmacKey = macAlgorithmProvider.CreateKey(binaryKeyMaterial);
        var binarySignedMessage = CryptographicEngine.Sign(hmacKey, binaryMessage);
        var signedMessage = CryptographicBuffer.EncodeToBase64String(binarySignedMessage);
        return signedMessage;
    }

Тест для проверки примера:

var hmac = this.Amazon.CreateHMAC("GET\nwebservices.amazon.com\n/onca/xml\nAWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-06", "HMAC_SHA256", "1234567890");
var encoded = WebUtility.UrlEncode(hmac);
Assert.AreEqual("Nace%2BU3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg%3D", encoded);

И фактический результат:

M%2fy0%2bEAFFGaUAp4bWv%2fWEuXYah99pVsxvqtAuC8YN7I%3d

Кто-нибудь еще успешно создал HMAC на WinRT? Или вы видите, что я делаю неправильно?


person James Bloomer    schedule 19.04.2012    source источник


Ответы (2)


Документация Amazon неверна/устарела — используйте ecs.amazonaws.com вместо webservices.amazon.com

Итак, подпишите это:

GET\necs.amazonaws.com\n/onca/xml\nAWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%333

Извините, это очень быстрый ответ!

person James Corbould    schedule 27.05.2012

Ключ в amazon — это строка Base64, поэтому вам нужно преобразовать эту строку в объект IBuffer, но начиная с уже двоичного содержимого, представленного в виде строки Base 64. Вы конвертируете обычную строку в двоичную, что не так. попробуй это

var algorithmProvider = MacAlgorithmProvider.OpenAlgorithm(algorithmName);

var binaryKeyMaterial = CryptographicBuffer.DecodeFromBase64String(key);
var hmacKey = algorithmProvider.CreateKey(binaryKeyMaterial );

В этой статье блога я написал о как создать подпись из WinRT на испанском языке, но код универсальный, и вы можете перевести его через переводчик bing или какой-то другой.

person Community    schedule 12.12.2012