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