当前位置: 首页 > 知识库问答 >
问题:

在Delphi 10.3中提出AWS签名版本4请求,将Python代码移植到Delphi

潘振国
2023-03-14

我正在尝试在Delphi中构建AWS签名版本4请求。

我设法处理签名部分,但对规范请求有一些问题

我按照下面的链接创建一个规范请求https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html

如果我在Python3中执行此操作,请参见下面的代码,我将得到正确答案f536975d06c0309214f805bb90ccff089219ecd68b2577efef23edd43b7e1a59

我正试图在德尔福做同样的事情

结果是错误代码BFC216A33DE74E30285FC72D6DD2035508E9AE861E5D56B59F4C1EB4F29DDC3

现在有人在Delphi中如何做下面的Python行

PYTHON
canonical_request_hash = hashlib.sha256((canonical_request).encode('utf-8')).hexdigest()

并获得此结果f536975d06c0309214f805bb90ccff089219ecd68b2577efef23edd43b7e1a59

PYTHON CODE
canonical_request = "GET\n"+"/\n"+"Action=ListUsers&Version=2010-05-08\n"+"content-type:application/x-www-form-urlencoded; charset=utf-8\n"+"host:iam.amazonaws.com\n"+ "x-amz-date:20150830T123600Z\n"+ "\n"+ "content-type;host;x-amz-date\n"+ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"


canonical_request_hash = hashlib.sha256((canonical_request).encode('utf-8')).hexdigest()

print(canonical_request_hash)
DELPHI
 canonical_request :=  'GET\n'+'/\n'+'Action=ListUsers&Version=2010-05-08\n';
 canonical_request := canonical_request +'content-type:application/x-www-form-urlencoded; charset=utf-8\n'+'host:iam.amazonaws.com\n'+ 'x-amz-date:20150830T123600Z\n"+ "\n"+ "content-type;host;x-amz-date\n'+ 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855';

 canonical_request_hashed :=   BytesToHexConverter ( THashSHA2.GetHashBytes(UTF8Encode( canonical_request )));  // Struggle 

memo1.Lines.Add(canonical_request_hashed);
 memo1.Lines.Add('f536975d06c0309214f805bb90ccff089219ecd68b2577efef23edd43b7e1a59');

//*********************

function TForm1.BytesToHexConverter(b: Tbytes): string;
var
 I        : Integer;
 s        : String;
begin
 s:='';
 for i  := 0 to length(b)-1 do
   begin
    s:=s+b[i].ToHexString;
   end;
 s:= LowerCase(s);
 result:=s;
End;

我希望在delphi F536975D06C0309214F805BB90CCFF089219ECD68B257EFEF23EDD43B7E1A59中得到这个结果,但得到这个BFC216A33DE74E30285FC72D6DD2035508E9AE861E5D56B59F4C1EB4F29DDC3

共有1个答案

游安康
2023-03-14

您正试图从AWS留档页面上出现的示例炮制请求中计算SHA256哈希。纯文本如下:

获取
/
操作=列表用户

内容类型;主机;x-amz-date
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

您已成功地将此纯文本转换为Python字符串,但由于以下两个原因,在Delphi中未能实现此转换:

  1. 您将粘贴的Python代码复制到Delphi中,并将一些替换为,但并非如下面问题的注释所指出的全部。
  2. Delphi不允许在字符串文本中进行反斜杠转义。您只能通过键入两个单引号来转义单引号'。您可以直接键入或使用带前缀的字符文本的所有其他字符。因此,您还应将所有出现的\n转换为\10(新行字符)并将其置于字符串文本之外

德尔福的正确翻译为:

canonical_request :=
  'GET'#10 +
  '/'#10 +
  'Action=ListUsers&Version=2010-05-08'#10 +
  'content-type:application/x-www-form-urlencoded; charset=utf-8'#10 +
  'host:iam.amazonaws.com'#10 +
  'x-amz-date:20150830T123600Z'#10 + 
  #10 +
  'content-type;host;x-amz-date'#10 +
  'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855';

最终证明,这不是标题中所写的hexdigest()问题,而是将Python代码移植到Delphi的问题。

 类似资料:
  • 云: SDK版本:。 我想为我正在上传的对象进化对象锁定。 下面是我的代码,它正在生成signature 4标头,但我仍然无法解决该问题。 现在包含我的授权头的请求如下 AWS4-HMAC-SHA256凭据=xxxx/xx/us-East-1/s3/aws4_request, SignedHeaders=内容类型;x-amz-date; x-amz-对象-锁-法律-持有;x-amz-对象-锁-模式

  • " Life is pleasant. Death is peaceful. It’s the transition that’s troublesome. " — Isaac Asimov (attributed) 概述 几乎所有的Python 2程序都需要一些修改才能正常地运行在Python 3的环境下。为了简化这个转换过程,Python 3自带了一个叫做2to3的实用脚本(Utility S

  • null Edit2:为了一致性和正确性,将填充重命名为iVector。

  • 问题内容: 我正在尝试将代码从使用Java 计时器移植到使用Scheduledexecutorservice 我有以下用例 我应该用ScheduledExecutorService替换A类和B类中的Timer实例,并使ATimerTask和BTimerTask类成为Runnable类,例如 这样对吗。 编辑:移植的主要动机之一是因为在TimerTask中引发的运行时异常会杀死一个线程,因此无法对其

  • 此文档似乎有问题:http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-authentication-HTTPPOST.html 我一丝不苟地遵循它,它似乎确实奏效了。我总是收到签名不匹配错误。v2授权仍然有效。让我想知道这是否是某种阿尔法阶段质量的产品。 下面是我的php代码。我试图模仿本页中的示例:http://docs.aws.amazon

  • 我想将用户配置文件图片存储在S3桶中,但保留这些图片的私密性。为了做到这一点,我正在创建一个预先签名的网址,每当图像是必需的。然而,这每次都会创建一个独特的网址,这意味着浏览器永远不会缓存图像,最终我会在GET请求中支付更多。 下面是生成url的代码示例,我使用的是Laravel: 我认为,通过指定日期时间而不是时间单位,它将创建相同的url,但实际上会将剩余秒数添加到url,下面是一个示例: x