HMAC (Hash-based Message Authentication Code) — это алгоритм, который используется для проверки целостности сообщений. В случае использования алгоритма SHA1, HMAC_SHA1 применяется для создания уникального кода аутентификации сообщения, который включает в себя секретный ключ. Это позволяет обеспечить, что сообщение не было изменено в процессе передачи и что его можно аутентифицировать только с использованием этого самого ключа.
Для разработчиков, работающих с Delphi, важно понимать, как правильно использовать CryptoAPI для создания HMAC_SHA1, чтобы обеспечить безопасность в своих приложениях. В данной статье мы рассмотрим, как исправить проблему, описанную пользователем, который столкнулся с неверным результатом при использовании CryptoAPI для HMAC_SHA1.
Проблема с HMAC_SHA1 в CryptoAPI
Пользователь столкнулся с несоответствием результатов HMAC_SHA1, полученных с помощью CryptoAPI и Indy's TidHMACSHA1. Разница в результатах была вызвана неправильным использованием функции CryptDeriveKey, которая применяла RC4 для кодирования ключа перед использованием в HMAC. Исправление состояло в использовании функции CryptImportKey для импорта ключа в исходном виде, без дополнительного кодирования.
Исправленный код
В исправленном коде используется функция CryptImportKey для импорта ключа в формате PLAINTEXTKEYBLOB, что позволяет использовать ключ без дополнительной обработки. Это решение позволяет получить правильный HMAC_SHA1, соответствующий ожидаемому результату, который совпадает с результатами других библиотек и онлайн-генераторов.
function Hashhmacsha1(const Key, Value: AnsiString): AnsiString;
const
KEY_LEN_MAX = 16;
var
hCryptProvider: HCRYPTPROV;
hHash: HCRYPTHASH;
hKey: HCRYPTKEY;
bHash: array[0..$7F] of Byte;
dwHashLen: dWord;
i: Integer;
hPubKey : HCRYPTKey;
hHmacHash: HCRYPTHASH;
bHmacHash: array[0..$7F] of Byte;
dwHmacHashLen: dWord;
hmac_info : Wcrypt2.HMAC_INFO;
keyBlob: record
keyHeader: BLOBHEADER;
keySize: DWORD;
keyData: array[0..KEY_LEN_MAX-1] of Byte;
end;
keyLen : INTEGER;
begin
// ... (инициализация переменных и контекста провайдера)
if CryptAcquireContext(@hCryptProvider, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) then
begin
// ... (создание хэш-объекта и получение хэша ключа)
hPubKey := 0;
FillChar(keyBlob, SizeOf(keyBlob), 0);
keyBlob.keyHeader.bType := PLAINTEXTKEYBLOB;
keyBlob.keyHeader.bVersion := CUR_BLOB_VERSION;
keyBlob.keyHeader.aiKeyAlg := CALG_RC4;
keyBlob.keySize := KEY_LEN_MAX;
keyLen := Length(Key);
if keyLen > KEY_LEN_MAX then
keyLen := KEY_LEN_MAX;
Move(AnsiString(Key)[1], keyBlob.keyData[0], keyLen);
if CryptImportKey(hCryptProvider, @keyBlob, SizeOf(keyBlob), hPubKey, 0, @hKey) then
begin
// ... (создание хэш-объекта для HMAC и настройка параметров)
// ...
end;
// ... (остальная часть функции, включая обработку ошибок и освобождение ресурсов)
end;
Result := AnsiLowerCase(Result);
end;
Важные моменты
При использовании CryptImportKey с флагом CRYPT_IPSEC_HMAC_KEY можно импортировать ключи большего размера, чем 16 байт, по крайней мере для CALG_RC2.
Важно помнить, что для безопасной работы с HMAC, ключ должен быть секретным и не должен передаваться в открытом виде.
Альтернативные решения
Для тех, кто хочет избежать сложностей с Win32 CryptoAPI, можно использовать OpenSSL, который предоставляет более простой и гибкий интерфейс для создания HMAC. Пример использования OpenSSL для создания HMAC_SHA1 будет выглядеть следующим образом:
Этот код инициализирует HMAC с алгоритмом SHA1, используя предоставленный ключ и сообщение, и затем сохраняет результат в переменную mac.
Заключение
В данной статье мы рассмотрели, как важно правильно настроить HMAC_SHA1 через CryptoAPI в Delphi для обеспечения безопасности приложений. Используя исправленный код и учитывая альтернативные решения, разработчики могут избежать распространенных ошибок и улучшить безопасность своих проектов.
Улучшение безопасности: настройка HMAC_SHA1 через CryptoAPI в Delphi для корректной аутентификации сообщений.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS