HMAC-SHA256 в городе Дельфы
Мне нужно создать подписи HMAC-SHA256 для API Amazon web services. Старая библиотека DCPcrypt имеет процедуры sha256, но не делает подписи HMAC. Кто-нибудь знает бесплатную библиотеку хэширования, которую я мог бы использовать?
6 ответов
после немного большего поиска я нашел OpenStreamSec-который выглядит так, как будто он был заброшен несколько лет назад, но все еще компилируется в D2007.
http://sourceforge.net/projects/openstrsecii/
создание HMAC-256 для Amazon очень просто:
StrToMime64(HMACString(haSHA256, SecretKey, 32, DataToHash));
мой любимый ответ - я бы использовал библиотеки OpenSSL, функцию HMAC.
Я успешно использовал библиотеки OpenSSL в Delphi, приняв и адаптировав работу от M Ferrante http://www.disi.unige.it/person/FerranteM/delphiopenssl/
Для подписания пакет и т. д. см. этой ссылке
В 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 или что-то подобное.
Отказ от ответственности: у меня нет справочных данных, чтобы проверить это, но, похоже, работает нормально!
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;
HMAC - это просто функция, которая использует SHA256 для вычисления хэша в соответствии с некоторыми определенными правилами. Если вы посмотрите на Википедия Он имеет псевдокод пример.
вы также можете позвонить в .NET класс HMAC в систему.Безопасность.Криптография через COM interrop.
Что касается ответа от Jacob: OpenStrSecII-это ветвь StreamSec Tools 2.1, которая продается под коммерческой лицензией без глупостей, и сегодня (8 февраля 2012 года) имеет поддержку Delphi Win32 до и включая Delphi XE2. StreamSec Tools 4.0 также поддерживает Win64.