HMAC-SHA256 в Дельфи - PullRequest
       56

HMAC-SHA256 в Дельфи

7 голосов
/ 05 января 2010

Мне нужно сгенерировать подписи HMAC-SHA256 для API веб-сервисов Amazon. Старая библиотека DCPcrypt имеет подпрограммы sha256, но не выполняет подпись HMAC. Кто-нибудь знает бесплатную библиотеку хеширования, которую я мог бы использовать?

Ответы [ 6 ]

4 голосов
/ 06 января 2010

После небольшого поиска я обнаружил OpenStreamSec - похоже, он был заброшен несколько лет назад, но все еще компилируется в D2007.

http://sourceforge.net/projects/openstrsecii/

Создать HMAC-256 для Amazon очень просто:

StrToMime64(HMACString(haSHA256, SecretKey, 32, DataToHash));
3 голосов
/ 21 октября 2016

Delphi поставляется с установленным Indy, а Indy имеет класс TIdHMACSHA256:

uses
  IdGlobal, IdHashSHA, IdHMAC, IdHMACSHA1, IdSSLOpenSSL;

function CalculateHMACSHA256(const value, salt: String): String;
var
  hmac: TIdHMACSHA256;
  hash: TIdBytes;
begin
  LoadOpenSSLLibrary;
  if not TIdHashSHA256.IsAvailable then
    raise Exception.Create('SHA256 hashing is not available!');
  hmac := TIdHMACSHA256.Create;
  try
    hmac.Key := IndyTextEncoding_UTF8.GetBytes(salt);
    hash := hmac.HashValue(IndyTextEncoding_UTF8.GetBytes(value));
    Result := ToHex(hash);
  finally
    hmac.Free;
  end;
end;
3 голосов
/ 05 января 2010

Мой любимый ответ - я бы использовал библиотеки OpenSSL, функцию HMAC. Я успешно использовал библиотеки OpenSSL в Delphi, переняв и адаптировав работу из M Ferrante http://www.disi.unige.it/person/FerranteM/delphiopenssl/
Другие подписи OpenSSL и т. Д. См. по этой ссылке
В D2010 это примерно так (libeay32 - это единица, взятая с веб-сайта и немного измененная для unicode / D2010):

uses libeay32;

const
  LIBEAY_DLL_NAME = 'libeay32.dll';
  EVP_MAX_MD_SIZE = 64;

function EVP_sha256: pEVP_MD; cdecl; external LIBEAY_DLL_NAME;
function HMAC(evp: pEVP_MD; key: PByte; key_len: integer; 
              data: PByte; data_len: integer; 
              md: PByte; var md_len: integer): PByte; cdecl; external LIBEAY_DLL_NAME;

function GetHMAC(const AKey, AData: string): TBytes;
var
  key, data: TBytes;
  md_len: integer;
  res: PByte;
begin
  OpenSSL_add_all_algorithms;
  // Seed the pseudo-random number generator
  // This should be something a little more "random"!
  RAND_load_file('c:\windows\paint.exe', 512);

  key := TEncoding.UTF8.GetBytes(AKey);
  data := TEncoding.UTF8.GetBytes(AData);
  md_len := EVP_MAX_MD_SIZE;
  SetLength(result, md_len);
  res := HMAC(EVP_sha256, @key[0], Length(key), @data[0], Length(data), @result[0], md_len);
  if (res <> nil) then
  begin
    SetLength(result, md_len);
  end;
end;

Затем назовите его ключевой фразой и строкой данных. Результатом является TBytes, который может быть преобразован при необходимости, например, в Base64, используя что-то вроде JclMime или простую функцию типа HexToString.
Для более старой версии Delphi вам придется немного изменить PBytes на PChars или что-то подобное.
Отказ от ответственности: у меня нет справочных данных, чтобы проверить это, но, кажется, работает нормально!

2 голосов
/ 05 января 2010

HMAC - это просто функция, которая использует SHA256 для вычисления хэша в соответствии с некоторыми определенными правилами. Если вы посмотрите на Википедию , у нее есть псевдокод пример.

Вы также можете вызвать класс HMAC класса .NET в System.Security.Cryptography с помощью COM-взаимодействия.

2 голосов
/ 05 января 2010

Вы смотрели ответы на этот вопрос?

0 голосов
/ 08 февраля 2012

Относительно ответа от Jacob: OpenStrSecII - это ветвь StreamSec Tools 2.1, которая продается под коммерческой лицензией, которая не является бессмысленной, и сегодня (8 февраля 2012 г.) имеет поддержку Delphi Win32 вплоть до Delphi XE2. StreamSec Tools 4.0 также поддерживает Win64.

...