Amazon REST 调用的 HMAC 签名在 WinRT 上不正确

问题描述 投票:0回答:2

Amazon 有一些 examples 使用 HMAC 签署他们的 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

有其他人在 WinRT 上成功创建 HMAC 吗?或者你能看出我做错了什么吗?

c# windows-8 windows-runtime microsoft-metro amazon-product-api
2个回答
0
投票

亚马逊文档不正确/已过时 - 使用 ecs.amazonaws.com 而不是 webservices.amazon.com

所以签名:

获取 ecs.amazonaws.com /onca/xml AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Service=AWSCommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-06

抱歉,回复太快了!


0
投票

amazon 中的 key 是一个 Base64 字符串,所以你需要将这个字符串转换为 IBuffer 对象,但是从已经暴露为 Base 64 字符串的二进制内容开始。您正在将普通字符串转换为二进制,但事实并非如此。 试试这个

var algorithmProvider = MacAlgorithmProvider.OpenAlgorithm(algorithmName);

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

在这篇博客文章中,我写了关于如何从 WinRT 创建签名 是西班牙语,但代码是通用的,您可以通过 bing 翻译器或其他工具翻译它。

© www.soinside.com 2019 - 2024. All rights reserved.