堆栈溢出有很多问题与这个问题有一些相似之处,但没有什么比这更像。
我有一个应用程序可以查询AWS并发回XML数据。我已经监控了它,并发送了一个像这样的字符串:
如果您尝试一下,您将获得一些XML,告诉您“请求已过期。时间戳日期为2013-04-30T22:00:00.000Z”等。
如果“ToBeSigned”不匹配,您会收到消息“我们计算的请求签名与您提供的签名不符。”
我的问题是我无法获得生成正确“签名”的“ToBeSigned”版本。我发现文档令人困惑 - 也许是因为它适用于Java或PHP。
上述链接中的“ToBeSigned”是什么? 请在Delphi伪代码中
答案 0 :(得分:2)
以下是适用于我的Delphi代码。只需更改参数值以适合您的目的,并输入您自己的密钥。我把TimeStamp放在了现在加上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;