亚马逊AWS简单的图书查询.你如何在 Delphi 中做签名?

hrirmatl  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(118)

在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-30T22%3A00%3A00.000Z&Version=2011-08-01&Signature=n1x%2BtbR71WFAgPHYq4rrpamgMb4%3D
如果你尝试一下,你会得到一些XML,告诉你“请求已经过期。时间戳日期是2013-04- 30 T22:00:00.000Z”等等。
如果“ToBeSigned”不匹配,您将收到消息“我们计算的请求签名与您提供的签名不匹配”。
我的问题是我无法得到一个生成正确“签名”的“待签名”版本。我发现文档令人困惑-也许是因为它是面向Java或PHP的。
上面链接中正确的“待签名”是什么?请使用 Delphi 伪代码!

r8xiu3jd

r8xiu3jd1#

这是我用过的 Delphi 代码。只要改变参数的值来适应你的目的,并放入你自己的密钥。我把时间戳放在现在加上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;

相关问题