Зашифруйте и подпишите сообщение с использованием интерфейса поставщика поддержки безопасности Microsoft (SSPI)

Я хочу использовать интерфейс поставщика поддержки безопасности Microsoft (SSPI) в среде домена Windows (с Kerberos) для отправки зашифрованных и подписанных сообщений между двумя объектами (в C ++).

Основываясь на документации в MSDN, есть две функции MakeSignature () и EncryptMessage () [1], но документация и пример кода [2] явно не отвечают на вопрос о том, как отправлять данные в зашифрованном виде. а также подписано (в соответствии с encrypt-than-mac).

Может кто-нибудь подтвердить, что я должен использовать вручную вызывать EncryptMessage () и MakeSignature () в последовательности, чтобы получить желаемый результат? Или я что-то там пропускаю, и EncryptMessage () имеет способ напрямую создать подпись зашифрованных данных?

[1] Документация MSDN о EncryptMessage () и MakeSignature ()
https://msdn.microsoft.com/en-us/library/windows/desktop/aa378736(v=vs.85).aspx

https://msdn.microsoft.com/en-us/library/windows/desktop/aa375378(v=vs.85).aspx

[2] Пример кода MSDN
https://msdn.microsoft.com/en-us/library/windows/desktop/aa380531(v=vs.85).aspx

—- Ответить на ответ Ремуса Русану 2017-03-09 —————————

Спасибо @Remus Rusanu за ваш ответ, я еще не учел документ о совместимости GSSAPI.

Вот указано, что «GSS_Wrap и GSS_Unwrap используются как для целостности, так и для конфиденциальности с использованием конфиденциальности, контролируемой значением аргумента« conf_flag »». и что «SSPI, эквивалентный GSS_Wrap, является EncryptMessage (Kerberos) как для целостности, так и для конфиденциальности».

Вы сказали, что «EncryptMessage […] тоже будет подписывать, если этого требует согласованный контекст». Для меня это означает, что для InitializeSecurityContext () должны быть установлены как минимум следующие флаги fContextReq:

  • ISC_REQ_CONFIDENTIALITY
  • ISC_REQ_INTEGRITY

Можете ли вы (или кто-то еще) это подтвердить?

—- Обновление 2017-03-16 ——————————————— ———————

После дальнейших исследований я пришел к следующему выводу:

  1. Специфичная для Kerberos функция EncryptMessage () не обеспечить целостность сообщения независимо от того, как был инициализирован Securitycontext.

    • общий EncryptMessage () а также общее DecryptMessage функции поддерживают функцию создания и проверки целостности сообщения, поскольку существуют некоторые поддерживающие провайдеры поддержки безопасности (SSP), но Kerberos нет.

    • Если DecryptMessage проверит целостность сообщения, в случае модифицированного сообщения должен быть соответствующий код возврата ошибки. Общий интерфейс DecryptMessage перечисляет код ошибки «SEC_E_MESSAGE_ALTERED», который описывается как «Сообщение было изменено. Используется с SSP Digest и Schannel.».

    • Конкретный интерфейс DecryptMessage для SSP Digest и Schannel перечисляет SEC_E_MESSAGE_ALTERED — но Kerberos DecryptMessage не.

    • В описании параметров общей документации EncryptMessage термин «подпись» используется только в отношении дайджеста SSP: «При использовании дайджеста SSP должен быть второй буфер типа
      SECBUFFER_PADDING или SEC_BUFFER_DATA для хранения информации о подписи «.

  2. MakeSignature не создает цифровую подпись в соответствии с Определение Википедии (подлинность + отказ от авторства + целостность). MakeSignature создает криптографический хеш для обеспечения целостности сообщения.

    • Название функции MakeSignature () приводит к мысли, что SSPI создает цифровую подпись (аутентичность + отказ от авторства + целостность), но MakeSignature документация объясняет, что создается только криптографическая контрольная сумма (обеспечивающая целостность): «Функция MakeSignature генерирует криптографическую контрольную сумму сообщения, а также включает информацию о последовательности для предотвращения потери или вставки сообщения».

    • VerifySignature документация также помогает уточнить терминологию SSPI: «Проверяет, что сообщение, подписанное с помощью функции MakeSignature, было получено в правильной последовательности и не было изменено».

  3. Из (1) и (2) следует, что нужно вызвать EncryptData (), а затем MakeSignature () (для зашифрованного текста) для достижения конфиденциальности и целостности.

Надеюсь, что мой ответ поможет кому-то в какой-то момент;)

Если кому-то есть что добавить или исправить в моем ответе, пожалуйста, ответьте и помогите улучшить собранную здесь информацию!

1

Решение

Если я правильно помню, вы только звоните EncryptMessage/DecryptMessage и это сделает подпись тоже, если согласованный контекст требует этого. Например, если вы посмотрите на Взаимодействие SSPI / Kerberos с GSSAPI говорится, что EncryptMessageпары с GSS_Unwrap а также DecryptMessage пары с GSS_Wrap, без с участием MakeSignature, Пример в ссылке также показывает, что вы должны предоставить 3 Структуры SecBuffer (SECBUFFER_TOKEN, SECBUFFER_DATA а также SECBUFFER_PADDINGпоследнее, что я считаю необязательным) EncryptMessage и 2 для DecryptMessage, Два дополнительных примера в Использование SSPI с сервером Windows Sockets а также Использование SSPI с клиентом Windows Sockets дать полный функциональный обмен сообщениями, и вы также можете увидеть, что MakeSignature/VerifySignature никогда не вызывается, подпись обрабатывается Encrypt / Decrypt и помещается в заголовок или трейлер «маркера безопасности» (куда он идет по проводу, не указывается SSPI / SPNego / Kerberos, это не TLS / Schannel .. .).

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]