web-dev-qa-db-ja.com

HTTPリクエスト「...」で見つかったMAC署名は、計算された署名と同じではありません

このURLのAzureBlobストレージから単純な.jpgを取得するようにPostmanで次のリクエストを送信しています https://steamo.blob.core.windows.net/testcontainer/dog.jpg

GET /testcontainer/dog.jpg HTTP/1.1
Host: steamo.blob.core.windows.net
Authorization: SharedKey steamo:<my access key>
x-ms-date: Tue, 26 May 2015 17:35:00 GMT
x-ms-version: 2014-02-14
Cache-Control: no-cache
Postman-Token: b1134f8a-1a03-152c-2810-9cb351efb9ce

Postmanに慣れていない場合は、RESTクライアントです。Postman-Tokenヘッダーはおそらく無視できます。

アクセスキーは、Azure管理ポータルからコピーされます。

このエラーが発生します:

Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. RequestId:2482503d-0001-0033-60da-9708ed000000 Time:2015-05-26T17:35:41.4577821Z

このAutheticationErrorDetailで:

The MAC signature found in the HTTP request '<my access key>' is not the same as any computed signature. Server used following string to sign: 'GET x-ms-date:Tue, 26 May 2015 17:35:00 GMT x-ms-version:2014-02-14 /steamo/testcontainer/dog.jpg'.

これを修正するにはどうすればよいですか?私からの情報がさらに必要な場合はお知らせください。

14
starlord7

Azure Storageの認証は、単にアクセスキーを提供するだけの問題ではありません(これはあまり安全ではありません)。指定された要求を表す署名文字列を作成し、HMAC-SHA256アルゴリズムを使用して文字列に署名し(ストレージキーを使用して署名し)、結果をbase 64でエンコードする必要があります。 https:// msdn。署名文字列の作成方法など、詳細については、Microsoft.com/en-us/library/Azure/dd179428.aspx を参照してください。

12

これが機能するようになりました。これが私のコードです。

string signWithAccountKey(string stringToSign, string accountKey)
{
    var hmacsha = new System.Security.Cryptography.HMACSHA256();
    hmacsha.Key = Convert.FromBase64String(accountKey);
    var signature = hmacsha.ComputeHash(Encoding.UTF8.GetBytes(stringToSign));
    return Convert.ToBase64String(signature);
}
6
Ambrose Leung