[英]Delphi - Amazon MWS API - How do derive the Base64 HMAC from the SHA 256 HMAC?
使用:
我正在編寫一個 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 簽名
有人可以幫幫我嗎!?
那是因為您根本不了解Base64的全部內容,包括如何正確編寫它。 它的主要目的是通過 7 位(即 ASCII)安全地攜帶 8 位數據(即整個字節):
這也是編碼將大小膨脹 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.