亚马逊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?

我有上述所有这些参数,但我不知道如何生成这最后一个?

有人可以帮我吗?

+0

任何家伙?有小费吗 ? – User987

AWS利用HMAC请求签名。一般来说,它的工作方式是创建一个“消息”,它由诸如访问密钥,请求头,请求主体和时间戳等组成。然后你HMAC这个“消息”,并成为你的“签名”的请求。这可以防止重放攻击,因为每个请求都必须具有唯一的签名。

它看起来像时间戳只需要在ISO格式(YYYY-MM-DDThh:mm:ssZ),所以,不,你不能只使用DateTime.NowToString使用的默认格式不是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; 
} 
+0

克里斯哇非常感谢!我发现这段代码,但我仍然对参数的“RegionName”和“ServiceName”部分感到困惑,我需要在那部分放置什么? – User987

+1

这就是AWS特有的东西,但我相信它们指的是您的地区,因为像AWS这样的云服务通常是针对特定地区的('east-us-1')。无论你在做什么,都会去那里。该服务可能是您提出请求的特定AWS服务(例如'iam') –

+0

惊人的Chriss非常感谢!传入getSignatureMethod的dateStamp怎么样,是否需要以与时间戳相同的格式传递(yyyy-MM-ddThh:mm:ssZ)? – User987