Cómo deshabilitar el cifrado de firmas digitales
De forma predeterminada, un mensaje se firma y la firma se cifra digitalmente. Esto se controla mediante la creación de un enlace personalizado con una instancia de AsymmetricSecurityBindingElement o el SymmetricSecurityBindingElement, y estableciendo la propiedad MessageProtectionOrder de cualquier clase en un valor de enumeración MessageProtectionOrder. El valor predeterminado es SignBeforeEncryptAndEncryptSignature. Este proceso utiliza hasta un 30 por ciento más de tiempo que si, simplemente, se firma y cifra el mensaje en base a su tamaño total (cuanto más pequeño es el mensaje, mayor es el impacto en el rendimiento). No obstante, deshabilitar el cifrado de la firma puede permitir a un atacante suponer el contenido del mensaje. Esto es posible porque el elemento de firma contiene el código hash del texto sin formato de cada parte del mensaje firmada. Por ejemplo, aunque el cuerpo del mensaje se cifra de forma predeterminada, la firma no cifrada contiene el código hash del cuerpo del mensaje antes del cifrado. Si el conjunto de valores posibles para la parte firmada y cifrada es pequeño, un atacante podría ser capaz de deducir el contenido examinando el valor hash. El cifrado de la firma mitiga este vector de ataque.
Por lo tanto, deshabilite el cifrado de la firma sólo cuando el valor del contenido es bajo, o el conjunto de posibles valores de contenido es grande y no determinista, y el beneficio para el rendimiento es más importante que mitigar el ataque descrito anteriormente.
Nota
Si no hay nada cifrado en el mensaje, el elemento de firma no se cifra, incluso si la propiedad System.ServiceModel.Channels.AsymmetricSecurityBindingElement.MessageProtectionOrder o System.ServiceModel.Channels.SymmetricSecurityBindingElement.MessageProtectionOrder está establecida en SignBeforeEncryptAndEncryptSignature. Este comportamiento se produce incluso con enlaces proporcionados por el sistema; todos los enlaces proporcionados por el sistema tienen el orden de protección de mensaje establecido en SignBeforeEncryptAndEncryptSignature. Sin embargo, el Lenguaje de descripción de servicio web (WSDL) que WCF genera, seguirá incluyendo la aserción <sp:EncryptSignature>.
Para deshabilitar la firma digital
Cree un objeto CustomBinding. Para obtener más información, consulte Cómo: Crear un enlace personalizado mediante SecurityBindingElement.
Agregue AsymmetricSecurityBindingElement o SymmetricSecurityBindingElement a la colección de enlaces.
Establezca la propiedad System.ServiceModel.Channels.AsymmetricSecurityBindingElement.MessageProtectionOrder en SignBeforeEncrypt o establezca la propiedad System.ServiceModel.Channels.SymmetricSecurityBindingElement.MessageProtectionOrder en SignBeforeEncrypt.