Amazon API 在 C# .NET 中生成请求签名

Use*_*987 0 c# asp.net asp.net-mvc amazon-web-services c#-4.0

我试图弄清楚如何在我的 .NET 应用程序中传递参数。URL 请求如下所示:

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]
Run Code Online (Sandbox Code Playgroud)

我感到困惑的部分是:

 &Timestamp=[YYYY-MM-DDThh:mm:ssZ]
      &Signature=[Request_Signature]
Run Code Online (Sandbox Code Playgroud)

我不确定我是否可以简单地为时间戳部分做这样的事情:

var TimeStamp  = DateTime.Now; // without any special datetime formating? 
Run Code Online (Sandbox Code Playgroud)

所以我的问题是如何在请求 URL 中实际生成此签名 URL?

我有上面所有这些参数,但我不确定如何生成最后一个?

有人可以帮我吗 ?

Chr*_*att 5

AWS 使用 HMAC 请求签名。一般来说,其工作方式是创建一条“消息”,它由访问密钥、请求标头、请求正文和时间戳等内容组成。然后,您 HMAC 这条“消息”,它就成为您的请求的“签名”。这可以防止重放攻击,因为每个请求都必须具有唯一的签名。

看起来时间戳只需采用 ISO 格式 ( YYYY-MM-DDThh:mm:ssZ),所以,不,你不能只使用DateTime.Now. 使用的默认格式ToString不是 ISO。相反,您需要使用类似的东西:

DateTime.Now.ToString("yyyy-MM-ddThh:mm:sszzz");
Run Code Online (Sandbox Code Playgroud)

或者,使用 UTC 时间并简单地附加一个实际上可能会更好Z

DateTime.UtcNow.ToString("yyyy-MM-ddThh:mm:ssZ");
Run Code Online (Sandbox Code Playgroud)

至于创建签名,请参阅AWS文档,其中提供了一些示例代码:

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;
}
Run Code Online (Sandbox Code Playgroud)