Практическое руководство. Выключение шифрования цифровых сигнатур
По умолчанию сообщение подписывается и цифровая подпись шифруется. Этим процессом можно управлять, создавая пользовательскую привязку с экземпляром элемента AsymmetricSecurityBindingElement или SymmetricSecurityBindingElement и присваивая свойству MessageProtectionOrder
каждого класса значение перечисления MessageProtectionOrder. Значение по умолчанию — SignBeforeEncryptAndEncryptSignature. Этот процесс занимает на 30 процентов больше времени, чем подпись и шифрование на основе полного размера сообщения (чем меньше сообщение, тем больше влияние на производительность). Однако в случае отключения шифрования подписи злоумышленник может распознать содержимое сообщения. Это обусловлено тем, что элемент подписи содержит хэш-код обычного текста каждой подписанной части сообщения. Например, хотя тело сообщения шифруется по умолчанию, нешифрованная подпись содержит хэш-код тела сообщения до шифрования. Если набор возможных значений для подписанной и зашифрованной части невелик, злоумышленник может понять содержимое, просмотрев хэш-значение. Шифрование подписи уменьшает вектор атак.
Таким образом, отключать шифрование подписи рекомендуется только тогда, когда содержимое имеет невысокую ценность или набор возможных значений содержимого велик и недетерминирован, и производительность имеет более высокое значение, чем снижение вероятности атаки, описанной выше.
Примечание.
Если никакая часть сообщения не шифруется, элемент подписи также не шифруется, даже если свойству AsymmetricSecurityBindingElement.MessageProtectionOrder или SymmetricSecurityBindingElement.MessageProtectionOrder присвоено значение SignBeforeEncryptAndEncryptSignature. Это поведение возникает даже с привязками, предоставляемыми системой; у всех предоставляемых системой привязок порядку защиты сообщений задано значение SignBeforeEncryptAndEncryptSignature
. Однако функция WCF языка описания веб-служб (WSDL) по-прежнему <sp:EncryptSignature>
будет содержать утверждение.
Отключение цифровой подписи
Создайте CustomBinding. Дополнительные сведения см. в разделе "Практическое руководство. Создание пользовательской привязки с помощью SecurityBindingElement".
Добавьте в коллекцию привязок элемент AsymmetricSecurityBindingElement или SymmetricSecurityBindingElement.
Присвойте свойству AsymmetricSecurityBindingElement.MessageProtectionOrder значение SignBeforeEncrypt или присвойте свойству SymmetricSecurityBindingElement.MessageProtectionOrder значение SignBeforeEncrypt.