Создание HMAC
Вычислить HMAC
- Получите указатель на поставщика криптографических служб Microsoft (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). Использование одного и того же ключа для обоих значительно повышает риск декодированных злоумышленниками сообщений.