我正在嘗試使用 REST 客戶端在 Delphi 中使用 OVH API。對于這個 OVH 要求我生成一個簽名,但他們的檔案沒有提供太多關于此的資訊,除了:
"$1$" SHA1_HEX(AS " " CK " " METHOD " " QUERY " " BODY " " TSTAMP)
他們確實為其他語言提供了瘦包裝器,所以我想我可以看看那些并嘗試復制它。我發現以下用于在 C# 中生成簽名并提取了要在測驗應用程式中使用的函式。
測驗應用程式 C# 代碼:
textBox1.Text = GenerateSignature("appSecret", "consKey", 123456789, "PUT", "/path/to/api", "TEST DATA");
C# 結果是:
$1$8336ecc5d03640b976e0b3ba005234a3046ab695
我嘗試在 Delphi 中重寫函式并提出以下函式:
function GenerateSignature(const appSecret, consKey: string;
const currentTimeStamp: LongInt; const method, target: string;
const data: string = ''): string;
begin
var
toSign := string.Join(' ', [appSecret, consKey, method, target, data,
currentTimeStamp]);
var
binaryHash := THashSHA1.GetHashBytes(toSign);
var
signature := '';
for var byte in binaryHash do
begin
signature := signature byte.ToHexString.ToLower;
end;
Result := '$1$' signature;
end;
并對其進行測驗:
procedure Main;
const
APP_SECRET = 'appSecret';
CONSUMER_KEY = 'consKey';
method = 'PUT';
target = '/path/to/api';
data = 'TEST DATA';
CURRENT_TIMESTAMP = 123456789;
begin
Writeln(GenerateSignature(APP_SECRET, CONSUMER_KEY, CURRENT_TIMESTAMP,
method, data));
end;
C# 和 Delphi 中的兩個測驗應用程式都使用相同的資料,但產生不同的輸出。我的預期輸出是:
$1$8336ecc5d03640b976e0b3ba005234a3046ab695
但我最終從delphi得到以下輸出:
$1$d99fd5086853e388056d6fe37a9e2d0723de151b
我不太了解 C#,但它似乎得到了哈希位元組,然后將其轉換為十六進制并將其拼接在一起。如何修改我撰寫的 Delphi 函式以獲得預期的結果?
uj5u.com熱心網友回復:
由于最后一個引數是可選的,您沒有注意到(因為沒有編譯器錯誤/警告)您在呼叫/測驗函式時實際上錯過了一個引數,從而導致文本
'appSecret consKey PUT TEST DATA 123456789'被散列。這確實是
d99fd5086853e388056d6fe37a9e2d0723de151b
讓我重新格式化您的測驗以使其更明顯:
const
APP_SECRET = 'appSecret';
CONSUMER_KEY = 'consKey';
CURRENT_TIMESTAMP = 123456789;
method = 'PUT';
target = '/path/to/api'; // Where is this used?
data = 'TEST DATA';
begin
GenerateSignature
( APP_SECRET
, CONSUMER_KEY
, CURRENT_TIMESTAMP
, method
// Forgotten parameter
, data // becomes "target"
);
end;
考慮將其設定為const data: string = ''強制性的,而不是可選的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/484636.html
標籤:德尔福 沙1 delphi-10.4-悉尼 呵呵
