HMAC-SHA256 в Delphi

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

7
задан Jacob 4 January 2010 в 23:51
поделиться

4 ответа

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

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

Генерация HMAC-256 для Amazon действительно проста:

StrToMime64(HMACString(haSHA256, SecretKey, 32, DataToHash));
4
ответ дан 6 December 2019 в 15:23
поделиться

Мой любимый ответ - я бы использовал библиотеки OpenSSL, функцию HMAC. Я успешно использовал библиотеки OpenSSL в Delphi, переняв и адаптировав работу от M Ferrante http://www.disi.unige.it/person/FerranteM/delphiopenssl/
Для других подписей OpenSSL и т.д. смотрите эту ссылку
В D2010 это что-то вроде этого (libeay32 - модуль, взятый с сайта и слегка модифицированный для юникода/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 или что-то в этом роде
. Отказ от ответственности: У меня нет справочных данных, чтобы проверить это, но, похоже, это работает хорошо!

3
ответ дан 6 December 2019 в 15:23
поделиться

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

2
ответ дан 6 December 2019 в 15:23
поделиться

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

Вы также можете вызвать .NET's HMAC Class в System.Security.Cryptography через COM interrop.

.
2
ответ дан 6 December 2019 в 15:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: