Я хочу использовать интерфейс поставщика поддержки безопасности 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/aa375378(v=vs.85).aspx
[2] Пример кода MSDN—- Ответить на ответ Ремуса Русану 2017-03-09 —————————
Спасибо @Remus Rusanu за ваш ответ, я еще не учел документ о совместимости GSSAPI.
Вот указано, что «GSS_Wrap и GSS_Unwrap используются как для целостности, так и для конфиденциальности с использованием конфиденциальности, контролируемой значением аргумента« conf_flag »». и что «SSPI, эквивалентный GSS_Wrap, является EncryptMessage (Kerberos) как для целостности, так и для конфиденциальности».
Вы сказали, что «EncryptMessage […] тоже будет подписывать, если этого требует согласованный контекст». Для меня это означает, что для InitializeSecurityContext () должны быть установлены как минимум следующие флаги fContextReq:
Можете ли вы (или кто-то еще) это подтвердить?
—- Обновление 2017-03-16 ——————————————— ———————
После дальнейших исследований я пришел к следующему выводу:
Специфичная для 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 для хранения информации о подписи «.
MakeSignature не создает цифровую подпись в соответствии с Определение Википедии (подлинность + отказ от авторства + целостность). MakeSignature создает криптографический хеш для обеспечения целостности сообщения.
Название функции MakeSignature () приводит к мысли, что SSPI создает цифровую подпись (аутентичность + отказ от авторства + целостность), но MakeSignature документация объясняет, что создается только криптографическая контрольная сумма (обеспечивающая целостность): «Функция MakeSignature генерирует криптографическую контрольную сумму сообщения, а также включает информацию о последовательности для предотвращения потери или вставки сообщения».
VerifySignature документация также помогает уточнить терминологию SSPI: «Проверяет, что сообщение, подписанное с помощью функции MakeSignature, было получено в правильной последовательности и не было изменено».
Из (1) и (2) следует, что нужно вызвать EncryptData (), а затем MakeSignature () (для зашифрованного текста) для достижения конфиденциальности и целостности.
Надеюсь, что мой ответ поможет кому-то в какой-то момент;)
Если кому-то есть что добавить или исправить в моем ответе, пожалуйста, ответьте и помогите улучшить собранную здесь информацию!
Если я правильно помню, вы только звоните 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 .. .).
Других решений пока нет …