Как получить подпись Azure Cosmo DB от Delphi - PullRequest
0 голосов
/ 08 мая 2018

Мой проект должен подключиться к Azure Cosmo DB через REST API. Соединение Azure Cosmo DB требует передачи подписи HMACSHA256 в заголовок HTTP. Я попытался использовать функцию THashSHA2.GetHMAC (Data, Key) в Delphi 10.2, чтобы получить эту подпись. Чтобы проверить результат, я запускаю пример кода на C # (скачанный с MS), чтобы проверить результат, сгенерированный Delphi. К сожалению, они не одинаковы! C #: 2LuKbSl8RkLc0eKhjQv4oCpXzRcmR02L9sDfSxSB5HA = Delphi: 2ca409c9a26aa3ed6c772b6bda5bbe66bcd0d929c3ca4359f19ea42314437e5a Я проверяю результат Delphi с помощью онлайн-генератора HMACSHA256. Delphi правильно.

Я искал в Интернете, чтобы найти другой способ создания подписи. Я получил TIdHMACSHA256 (используя IdSSLOpenSSL.LoadOpenSSLLibrary). Я попробовал код, но тоже не повезло. Результат (96OyCOmXzODAP9CljJgleuG5J5c4nIDeiSlr3hdcpYY =) также не совпадает с результатом, сгенерированным C #.

Я заметил, что код C # запускает Convert.FromBase64String (key), чтобы преобразовать ключ в байт, сгенерировать хеш, а затем Convert.ToBase64String (hashPayLoad) в подпись. Я подозреваю, что неправильный результат в Delphi пропускает подобные шаги. Но я не знаю, как это сделать.

У кого-нибудь есть опыт создания подписи Azure Cosmo DB в Delphi? Пожалуйста помоги!

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Другой способ получить подпись Cosmos DB с помощью Delphi System.Hash

функция GenerateCosmosDBSignature (const AData, AKey: string): string; вар keyBytes, dataBytes: TBytes;

начать

keyBytes: = TNetEncoding.Base64.DecodeStringToBytes (AKEY); dataBytes: = TEncoding.UTF8.GetBytes (AData);

результат: = AnsiString (TNetEncoding.Base64.EncodeBytesToString (THashSHA2.GetHMACAsBytes (dataBytes, keyBytes)));

конец; * +1011 *

0 голосов
/ 10 мая 2018

После поиска по всем возможным веб-сайтам и большого количества проб и ошибок я наконец-то нашел решение. Результат такой же, как подпись, сгенерированная из C #. Код был изменен с "https://www.delphipraxis.net/190563-dxe7-indy-hmac-sha256-encoding.html"

функция GenerateCosmosDBSignature (const AData, AKey: string): string; вар AHMAC: TIdBytes; байты: TBytes;

начать

IdSSLOpenSSL.LoadOpenSSLLibrary;

если не TIdHashSHA256.IsAvailable тогда

raise Exception.Create('SHA-256 hashing is not available!');

с TIdHMACSHA256.Создать до

попробовать

//original
//Key := IndyTextEncoding_UTF8.GetBytes(AKey);
//AHMAC := HashValue(IndyTextEncoding_UTF8.GetBytes(AData));

//after modified
Key := TIdBytes(TNetEncoding.Base64.DecodeStringToBytes(AKey));
AHMAC := HashValue(IndyTextEncoding_UTF8.GetBytes(AData));

наконец

Free;

конец;

// * оригинал 1023 *

// результат: = TIdEncoderMIME.EncodeBytes (AHMAC);

// после изменения

result: = AnsiString (TNetEncoding.Base64.EncodeBytesToString (System.TArray (AHMAC))));

конец;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...