Como: desabilitar criptografia de assinaturas digitais
Por padrão, uma mensagem é assinada e a assinatura é criptografada digitalmente. Isso é controlado pela criação de uma associação personalizada com uma instância do AsymmetricSecurityBindingElement ou do SymmetricSecurityBindingElement e a configuração da propriedade MessageProtectionOrder
de qualquer classe como um valor de enumeração MessageProtectionOrder. O padrão é SignBeforeEncryptAndEncryptSignature. Esse processo consome até 30% mais tempo do que simplesmente assinar e criptografar com base no tamanho geral da mensagem (quanto menor a mensagem, maior o impacto no desempenho). Desabilitar a criptografia da assinatura, no entanto, pode permitir que um invasor deduza o conteúdo da mensagem. Isso é possível porque o elemento de assinatura contém o código hash do texto sem formatação de cada parte assinada na mensagem. Por exemplo, embora o corpo da mensagem seja criptografado por padrão, a assinatura não criptografada contém o código hash do corpo da mensagem antes da criptografia. Se o conjunto de valores possíveis para a parte assinada e criptografada for pequeno, um invasor poderá deduzir o conteúdo examinando o valor do hash. Criptografar a assinatura reduz esse vetor de ataque.
Portanto, desabilite a criptografia da assinatura somente quando o valor do conteúdo for baixo ou o conjunto dos valores de conteúdo possíveis for grande e não determinístico, e o ganho de desempenho for mais importante do que atenuar o ataque descrito acima.
Observação
Se não houver nada na mensagem criptografada, o elemento de assinatura não será criptografado, mesmo quando a propriedade AsymmetricSecurityBindingElement.MessageProtectionOrder ou SymmetricSecurityBindingElement.MessageProtectionOrder estiver definida como SignBeforeEncryptAndEncryptSignature. Esse comportamento ocorre mesmo com associações fornecidas pelo sistema; todas as associações fornecidas pelo sistema têm a ordem de proteção de mensagem definida como SignBeforeEncryptAndEncryptSignature
. No entanto, a linguagem WSDL gerada pelo WCF ainda conterá a declaração <sp:EncryptSignature>
.
Para desabilitar a assinatura digital
Crie um CustomBinding. Para obter mais informações, consulte Como criar uma associação personalizada utilizando o SecurityBindingElement.
Adicione um AsymmetricSecurityBindingElement ou um SymmetricSecurityBindingElement à coleção de associação.
Defina a propriedade AsymmetricSecurityBindingElement.MessageProtectionOrder como SignBeforeEncrypt, ou defina a propriedade SymmetricSecurityBindingElement.MessageProtectionOrder como SignBeforeEncrypt.