Delphi - Amazon MWS API - 如何从 SHA 256 HMAC 导出 Base64 HMAC?

Delphi - Amazon MWS API - How do derive the Base64 HMAC from the SHA 256 HMAC?

使用:

我正在编写一个 Delphi 应用程序以从亚马逊 MWS API 获取订单列表。

我已按照他们的说明操作:

这里:

但是我卡在签名生成过程中,具体是生成Base64 HMAC。

我正在使用 IPWorks SSL 组件(哈希组件)并且能够根据输入生成 SHA 256 签名。到这一步一切正常。

这是我无法/不确定如何执行的下一步。

我正在使用 Amazon 暂存器生成请求,我看到了请求详细信息和生成的签名:SHA 256 和 Base 64。

我的 Delphi 代码不会像暂存器中生成的那样生成 Base 64 字符串。请参阅随附的屏幕截图(敏感信息已被编辑)。

这是我的 Delphi 代码,用于将 SHA 256 字符串转换为 Base 64:

procedure TAppMain.Button1Click(Sender: TObject);
var
  s: String;
  b: TBytes;
begin
  s := '9660152e55a7178db9a9521cd80b7f4872f4be2290d1dd0f32205708f2e06589';

  s := TNetEncoding.Base64.Encode(s);

  // Above line produces:
  // OTY2MDE1MmU1NWE3MTc4ZGI5YTk1MjFjZDgwYjdmNDg3MmY0YmUyMjkwZDFkZDBmMzIyMDU3MDhmMmUwNjU4OQ==
  // which is not equal to:
  // lmAVLlWnF425qVIc2At/SHL0viKQ0d0PMiBXCPLgZYk=

end;

有一位面临同样的问题,我已经尝试了该问题答案中的建议,但我仍然无法得出与Amazon Scratchpad 相同的结果。具体来说:

The SHA256 Scratchpad shows is not the value you convert with base64. You have to convert the Hex-Value of the SHA256.

我花了整整 2 天的时间尝试了很多东西来获得正确的结果,从 Google 搜索结果中阅读了很多文章,但我仍然找不到答案。

请查看我的其他相关问题,其中显示了完整的 Delphi 代码,以及我面临的问题的完整描述: Delphi - Calculating Amazon MWS signature

有人可以帮帮我吗?

那是因为你根本不理解Base64的全部要点,包括如何正确书写。它的主要目的是通过 7 位(即 ASCII)安全地携带 8 位数据(即整个字节):

  • 编码时取6bits作为一个字母显示
  • 解码时取一个字母,还原6bit原始数据

这也是编码将大小扩大 1/3 的原因。在电子邮件中发送附件时,前者存储在 Base64 中,因为电子邮件只有 7 位安全。这就是为什么发送 4 MiB 的大图片最终会生成至少 5.2 MiB 的电子邮件的原因。

不,Base64 编码已经是 ASCII 的东西是没有意义的,因此 7 位安全。当有人要他对文本 9660152e55a7178db9a9521cd80b7f4872f4be2290d1dd0f32205708f2e06589.

进行 Base64 编码时,每个人都应该感到震惊

您想编码字节,而不是文本。您看到的是这些字节的十六进制表示。你真的想要这个:

var
  input: Array of Byte;
  output: String;
begin
  SetLength( input, 32 );  // Represented in hexadecimal it would be a text of 64 characters
  input[0]:= ;
  input[1]:= ;
  input[2]:= ;
  ...
  output:= TNetEncoding.Base64.Encode( input );
  if output<> 'lmAVLlWnF425qVIc2At/SHL0viKQ0d0PMiBXCPLgZYk=' then Halt();  // Expected output

如果只是尝试解码您期望的内容并直视它,则更加明显:一次好像它是文本,一次是每个字符实际具有的字节值(因为您会发现它根本不是文本).文本不是字节,反之亦然。这就是 Base64 存在的原因。不只是为了好玩。