Compartilhar via


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

  1. Crie um CustomBinding. Para obter mais informações, consulte Como criar uma associação personalizada utilizando o SecurityBindingElement.

  2. Adicione um AsymmetricSecurityBindingElement ou um SymmetricSecurityBindingElement à coleção de associação.

  3. Defina a propriedade AsymmetricSecurityBindingElement.MessageProtectionOrder como SignBeforeEncrypt, ou defina a propriedade SymmetricSecurityBindingElement.MessageProtectionOrder como SignBeforeEncrypt.

Confira também