0

Amazonには、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を正常に作成しましたか?または、私が間違っていることがわかりますか?

4

2 に答える 2

0

AmazonのキーはBase64文字列であるため、この文字列をIBufferオブジェクトに変換する必要がありますが、Base64文字列として公開されている既にバイナリコンテンツから開始します。通常の文字列をバイナリに変換していますが、そうではありません。これを試して

var algorithmProvider = MacAlgorithmProvider.OpenAlgorithm(algorithmName);

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

このブログ記事では、WinRTから署名を作成する方法についてスペイン語で書いていますが、コードは普遍的であり、Bing翻訳者などを介して翻訳できます。

于 2012-12-12T01:20:53.390 に答える
0

Amazon ドキュメントが正しくない/古くなっている - webservices.amazon.comの代わりにecs.amazonaws.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%3A00Z&Version=2006-01

すいません、すっごく早い回答です!

于 2012-05-27T07:36:42.873 に答える