簡體   English   中英

Delphi - 亞馬遜 MWS API - 如何從 SHA 256 HMAC 派生 Base64 HMAC?

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

使用:

  • 德爾福 10.2.3 東京
  • IPWorks SSL、IPWorks 加密

我正在編寫一個 Delphi 應用程序來從 Amazon MWS API 獲取訂單列表。

我在這里按照他們的指示進行操作:

和這里:

但是我被困在簽名生成過程中,特別是生成 Base64 HMAC。

我正在使用 IPWorks SSL 組件(哈希組件)並且能夠根據輸入生成 SHA 256 簽名。 到這一步一切正常。

這是我無法/不確定如何執行的下一步。

我正在使用 Amazon 暫存器生成請求並查看請求詳細信息和生成的簽名:SHA 256 和 Base 64。

我的 Delphi 代碼不會像在便箋簿中生成的那樣生成 Base 64 字符串。 請參閱隨附的屏幕截圖(敏感信息已被編輯)。

這是我將 SHA 256 字符串轉換為 Base 64 的 Delphi 代碼:

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;

有一個StackOverflow 問題面臨同樣的問題,我已經嘗試了該問題的答案中的建議,但我仍然無法得出與 Amazon Scratchpad 相同的結果。 具體來說:

SHA256 Scratchpad 顯示的不是您使用 base64 轉換的值。 您必須轉換 SHA256 的十六進制值。

我花了整整 2 天的時間嘗試了很多事情以獲得正確的結果,從 Google 搜索結果中閱讀了很多文章,但我仍然無法找到答案。

請參閱我的其他相關問題,其中顯示了完整的 Delphi 代碼,以及我面臨的問題的完整描述: Delphi - 計算亞馬遜 MWS 簽名

有人可以幫幫我嗎!?

亞馬遜 MWS 便簽本

那是因為您根本不了解Base64的全部內容,包括如何正確編寫它。 它的主要目的是通過 7 位(即 ASCII)安全地攜帶 8 位數據(即整個字節):

  • 編碼時取 6 位並顯示為一個字母。
  • 解碼時取一個字母,恢復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]:= $96;
  input[1]:= $60;
  input[2]:= $15;
  ...
  output:= TNetEncoding.Base64.Encode( input );
  if output<> 'lmAVLlWnF425qVIc2At/SHL0viKQ0d0PMiBXCPLgZYk=' then Halt();  // Expected output

當試圖解碼您期望的內容並直視它時,這一點更加明顯:一次就好像它是文本一樣,一次是每個字符實際具有的字節值(因為您會看到它根本不是文本)。 文本不是字節,反之亦然。 這就是 Base64 存在的原因。 不只是為了好玩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM