亚马逊API在C#.NET中生成请求签名
问题描述:
我想弄清楚如何在.NET应用程序中传递参数。 URL请求的样子:亚马逊API在C#.NET中生成请求签名
http://webservices.amazon.com/onca/xml?
Service=AWSECommerceService
&Operation=ItemLookup
&ResponseGroup=Large
&SearchIndex=All
&IdType=UPC
&ItemId=635753490879
&AWSAccessKeyId=[Your_AWSAccessKeyID]
&AssociateTag=[Your_AssociateTag]
&Timestamp=[YYYY-MM-DDThh:mm:ssZ]
&Signature=[Request_Signature]
,我很困惑,难道这些部分:
&Timestamp=[YYYY-MM-DDThh:mm:ssZ]
&Signature=[Request_Signature]
我不知道是否我可以只是简单的做这样的事情的时间戳部分:
var TimeStamp = DateTime.Now; // without any special datetime formating?
所以我的问题是如何在请求URL中生成这个签名URL?
我有上述所有这些参数,但我不知道如何生成这最后一个?
有人可以帮我吗?
答
AWS利用HMAC请求签名。一般来说,它的工作方式是创建一个“消息”,它由诸如访问密钥,请求头,请求主体和时间戳等组成。然后你HMAC这个“消息”,并成为你的“签名”的请求。这可以防止重放攻击,因为每个请求都必须具有唯一的签名。
它看起来像时间戳只需要在ISO格式(YYYY-MM-DDThh:mm:ssZ
),所以,不,你不能只使用DateTime.Now
。 ToString
使用的默认格式不是ISO。相反,你需要使用类似:
DateTime.Now.ToString("yyyy-MM-ddThh:mm:sszzz");
或者它实际上可能是更好的使用UTC时间,只需追加Z
:
DateTime.UtcNow.ToString("yyyy-MM-ddThh:mm:ssZ");
至于创建签名,请参阅AWS documentation,他们提供了一些示例代码:
static byte[] HmacSHA256(String data, byte[] key)
{
String algorithm = "HmacSHA256";
KeyedHashAlgorithm kha = KeyedHashAlgorithm.Create(algorithm);
kha.Key = key;
return kha.ComputeHash(Encoding.UTF8.GetBytes(data));
}
static byte[] getSignatureKey(String key, String dateStamp, String regionName, String serviceName)
{
byte[] kSecret = Encoding.UTF8.GetBytes(("AWS4" + key).ToCharArray());
byte[] kDate = HmacSHA256(dateStamp, kSecret);
byte[] kRegion = HmacSHA256(regionName, kDate);
byte[] kService = HmacSHA256(serviceName, kRegion);
byte[] kSigning = HmacSHA256("aws4_request", kService);
return kSigning;
}
任何家伙?有小费吗 ? – User987