我尝试在 Delphi 中使用REST客户端来利用OVH API。对于这个OVH需要我生成一个签名,但是他们的文档没有提供更多的信息,除了:
"$1$" + SHA1_HEX(AS+"+"+CK+"+"+METHOD+"+"+QUERY+"+"+BODY+"+"+TSTAMP)
它们确实为其他语言提供了瘦 Package 器,所以我想我可以看看这些并尝试复制它。我发现了以下用于在C#中生成签名的代码,并提取了要在测试应用程序中使用的函数。
测试应用程序C#代码:
textBox1.Text = GenerateSignature("appSecret", "consKey", 123456789, "PUT", "/path/to/api", "TEST DATA");
C#的结果为:
2005年12月28日,纽约
我尝试在 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中的测试应用程序都使用相同的数据,但产生不同的输出。我期望的输出是:
2005年12月28日,纽约
但我最终从 Delphi 得到了以下输出:
1999年12月15日
我不知道C#很好,但它似乎得到哈希字节,然后转换成十六进制和缝合在一起。我怎么能修改我写的 Delphi 函数,使我可以得到我的预期结果?
1条答案
按热度按时间chhkpiq41#
由于最后一个参数是可选的,所以您没有注意到(因为没有编译器错误/警告)在调用/测试函数时实际上遗漏了一个参数,从而导致对文本
'appSecret+consKey+PUT+TEST DATA++123456789'
进行散列。一种用于汽车的发动机
让我重新格式化您的测试,使其更明显:
考虑将
const data: string = ''
也设为强制性的,而不是可选的。