1

stackoverflow 上有很多问题与这个问题有一些相似之处,但没有什么比这更相似的了。

我有一个应用程序可以查询 AWS 并发回 XML 数据。我已经对其进行了监控,它会发送一个像这样的字符串:

http://ecs.amazonaws.com/onca/xml?AWSAccessKeyId=AKIAID6DSLQQRYN3MDQA&AssociateTag=wwwratterriec-20&Keywords=031238792X&Operation=ItemSearch&SearchIndex=Books&Service=AWSECommerceService&SignatureMethod=HmacSHA1&SignatureVersion=2&Timestamp=2013-04-30T2200080-3A00%2010-2010-3A00%3A000% 01&签名=n1x%2BtbR71WFAgPHYq4rrpamgMb4%3D

如果你尝试一下,你会得到一些 XML,告诉你“请求已过期。时间戳日期是 2013-04-30T22:00:00.000Z”等。

如果“待签名”不匹配,您会收到消息“我们计算的请求签名与您提供的签名不匹配”。

我的问题是我无法获得生成正确“签名”的“ToBeSigned”版本。我发现文档令人困惑——可能是因为它适用于 Java 或 PHP。

以上链接中正确的“ToBeSigned”是什么?请在 Delphi 伪代码中!

4

1 回答 1

2

这是对我有用的德尔福代码。只需更改参数的值以适合您的目的并输入您自己的密钥。我将时间戳设置为现在加上 2.4 小时 - 更改它以适合您自己的目的。

procedure TForm1.ButtonWorksClick(Sender: TObject);
var
  toHash, SecretAccessKey, dirstr, awssignature, sg, ts, link: String;
  sig: T160BitDigest;
  SystemTime1: SYSTEMTIME;
  dt1: TDateTime;
begin
  GetSystemTime(SystemTime1);
  dt1 := SystemTimeToDateTime(SystemTime1) + 0.1;
  ts := '&Timestamp=' + HTTPEncode(FormatDateTime('yyyy"-"mm"-"dd"T"hh":00:00.000Z', dt1));

  tohash := 'GET' + Chr(10) + 'ecs.amazonaws.com' + Chr(10) + '/onca/xml' + Chr(10) +
    'AWSAccessKeyId=AKIAID6DSLQQRYN3MDQA&AssociateTag=locboo01-20&Keywords=031238792X&Operation=ItemSearch&SearchIndex=Books' +
    '&Service=AWSECommerceService&SignatureMethod=HmacSHA1&SignatureVersion=2' + ts + '&Version=2011-08-01';

  SecretAccessKey := 'Your secret key here';

  Sig := cHash.CalcHMAC_SHA1(SecretAccessKey, tohash);
  dirstr := cHash.SHA1DigestAsString(Sig);
  awssignature := EncdDecd.EncodeString(dirstr);

  sg := HTTPApp.HTTPEncode(awssignature);
  link := 'http://ecs.amazonaws.com/onca/xml' + '?' +
    'AWSAccessKeyId=AKIAID6DSLQQRYN3MDQA&AssociateTag=locboo01-20&Keywords=031238792X&Operation=ItemSearch&SearchIndex=Books' +
    '&Service=AWSECommerceService&SignatureMethod=HmacSHA1&SignatureVersion=2' + ts + '&Version=2011-08-01' + '&Signature=' + sg;
  Clipboard.AsText := link;

  Memo1.Lines.Add(sg);
end;
于 2013-05-02T04:49:34.730 回答