delphi 正在生成OVH SHA1签名

cetgtptt  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(137)

我尝试在 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 函数,使我可以得到我的预期结果?

chhkpiq4

chhkpiq41#

由于最后一个参数是可选的,所以您没有注意到(因为没有编译器错误/警告)在调用/测试函数时实际上遗漏了一个参数,从而导致对文本'appSecret+consKey+PUT+TEST DATA++123456789'进行散列。
一种用于汽车的发动机
让我重新格式化您的测试,使其更明显:

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 = ''也设为强制性的,而不是可选的。

相关问题