Поделиться через


Создание HMAC

Вычислить HMAC

  1. Получите указатель на поставщика криптографических служб Microsoft (CSP), вызвав CryptAcquireContext.
  2. Создайте дескриптор для HMACобъекта хэша, вызвав CryptCreateHash. Передайте CALG_HMAC в параметре Algid. Передайте хэндл симметричного ключа в параметре hKey. Этот симметричный ключ — это ключ, используемый для вычисления HMAC.
  3. Укажите тип хэша, который будет использоваться путем вызова CryptSetHashParam с параметром dwParam значением HP_HMAC_INFO. Параметр pbData должен указывать на инициализированную структуру HMAC_INFO.
  4. Вызовите CryptHashData, чтобы начать вычисление HMAC данных. Первый вызов CryptHashData приводит к объединении значения ключа с помощью оператора XOR с внутренней строкой и данными. Результат операции XOR хэшируется, а затем хэшируются целевые данные для HMAC (на которые указывает параметр pbData, переданный в вызове CryptHashData). При необходимости последующие вызовы CryptHashData могут быть выполнены для завершения хэширования целевых данных.
  5. Вызов CryptGetHashParam с параметром dwParam, установленным в HP_HASHVAL. Этот вызов приводит к завершению внутреннего хэша, а внешняя строка будет объединена с помощью XOR с ключом. Результат операции XOR хэшируется, а затем хэшируется результат внутреннего хэша, выполненного на предыдущем шаге. Затем внешний хэш завершается и возвращается в параметре pbData, а его длина - в параметре dwDataLen.

Заметка

Не используйте один и тот же симметричный (сеанс) ключ для шифрования сообщений и создания кода проверки подлинности сообщений (MAC). Использование одного и того же ключа для обоих значительно повышает риск декодированных злоумышленниками сообщений.