Tags:

Assinatura de mensagens XML

O uso de Web Services para integração de sistemas há muito se tornou um padrão de mercado.
A troca de mensagens XML facilita a comunicação de sistemas em diversas plataformas. Em muitos sistemas, informações críticas são trocadas e isso exige preocupação com a segurança desses dados.
Mas como saber se o XML foi enviado pela pessoa esperada? Como garantir que não foi adulterado?
Os objetivos da assinatura de mensagens XML são garantir a autenticidade de quem enviou e garantir que o XML não foi adulterado no meio do caminho através de critografia baseada num par de chaves pública/privada.

Esse tipo de criptografia procurar garantir:

  • Confidencialidade – a mensagem criptografada com uma chave pública só pode ser descriptografada com a chave privada correspondente
  • Autenticação – o receptor pode determinar quem enviou a mensagem
  • Integridade da mensagem – a mensagem não foi adulterada no meio do caminho
  • Não repudiação – quem enviou não pode dizer que não enviou

Como funciona a assinatura de mensagem XML:

1) Quem envia a mensagem gera, através de um algoritmo pré-acordado, um Hash/Digest(uma representação única e compactada) da mensagem a ser enviada, sendo que qualquer pequena alteração da mensagem gera um Digest diferente
2) O Digest é então criptografado utilizando a chave privada de quem envia, gerando uma assinatura (essa assinatura será enviada junto com a mensagem XML)
3) O receptor com a chave pública de quem enviou é capaz de descriptografar a assinatura e encontrar o valor do Digest (o fato de conseguir descriptografar garante que quem enviou foi realmente o dono daquele certificado público)
4) O receptor pode então a partir do XML recebido aplicar o algoritmo de hash, calcular o Digest
5) Com o Digest calculado é possível comparar com o Digest descriptografado da mensagem e assim garantir que possuem o mesmo valor, garantindo que nenhum dado na mensagem foi alterado no meio do caminho

 

Assim, o protocolo de assinatura digital garante:

  • Autenticidade da assinatura – descriptogrando o Digest com a chave pública garante que ela foi criptografada pelo dono daquela chave pública
  • Autenticação – somente o dono da chave privada poderia gerar a mensagem descriptograda pela chave pública
  • Integridade da mensagem – se a mensagem for adulterada o Digest calculado pelo receptor vai ser diferente do Digest descriptografado
  • Não repudiação – quem enviou não pode negar já que o receptor pode verificar sua a assinatura facilmente

 

No caso de XML existe uma padrão de informações para ser enviada junto com a mensagem XML.
As tags enviadas são:
Reference – id do trecho XML utilizado para calcular o Hash
Transforms – as informações sobre o algoritmo de Hash a ser utilizado pelo recepetor para poder fazer o cálculo
DigestValue – o valor do Digest
SignatureValue – a assinatura (que é o Digest criptografado)
X509Certificate – o certificado público

 

A linguagem Java possui API que trata a geração desse XML de assinatura.

Exemplo de uma assinatura de XML:

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<Reference URI="#IdTrechoXMLUtilizado">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>8hvBs4W4COJqnu2kZNOsSaM70e8=</DigestValue></Reference></SignedInfo>
<SignatureValue>TDb0ug0tnxVGygQGcJUdcGHYbJbrYSXbu/M25zlVJJhwfL+j1zP9kADWrA9x5xANiHSVX2olKz+E
ZCkZyqa+cC9oU0mSmYlNzLbj9yHmVxGPMeAXU55fpsndobEzrM417+sSHZJ0wbLo1ydJm7FEH1/N
StQ1bnUJ4VEgChVv29o=</SignatureValue><KeyInfo><X509Data>
<X509Certificate>MIICLDCCAZUCBE5qPNEwDQYJKoZIhvcNAQEEBQAwXTELMAkGA1UEBhMCQlIxCzAJBgNVBAgTAlNQ
MRIwEAYDVQQHEwlTYW8gUGF1bG8xDTALBgNVBAoTBE5PVEExDzANBgNVBAsTBkFydGlnbzENMAsG
A1UEAxMETk9UQTAeFw0xMTA5MDkxNjIwMzNaFw0xMjA5MDgxNjIwMzNaMF0xCzAJBgNVBAYTAkJS
MQswCQYDVQQIEwJTUDESMBAGA1UEBxMJU2FvIFBhdWxvMQ0wCwYDVQQKEwROT1RBMQ8wDQYDVQQL
EwZBcnRpZ28xDTALBgNVBAMTBE5PVEEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJoOe/G6
GyxKq857LlZASNrjjuylVG7PZxFdzGQrIeOS7rtLZvEYIqMCmR22ON+7VX26geABFblbrNzx8QZ8
RNGvxZ5JORhJWW0vTlL8maiPlXWLT+j8y82nRdloxbFXa0pNgKlbMi0HasDv2Jfu5W+C94CeZn34
7fKX9M9vYq6TAgMBAAEwDQYJKoZIhvcNAQEEBQADgYEAQEemlPpAc7IvykQCVktigaiypHHAek1j
V4Wu55XACm8CzzxfZnJa2bNHBroUzjTOUuO4ghbXFl5IQK36K176AIHwMgBiEeGFDPvc9zgtPHCz
57rYtepz/fjyMsj0Pq0bK8neYtDt6Vw57IiWipj3HYTf5rR45A+da3DjS/93Coo=</X509Certificate></X509Data></KeyInfo>
</Signature>

Por MATERA SYSTEMS

Postado em: 31 de janeiro de 2012

Confira outros artigos do nosso blog

REST não é JSON

21 de agosto de 2017

Bruno Sofiato

[Webinar] Profile de aplicações Java com Oracle Mission Control e Flight Recorder

24 de julho de 2017

Danival Calegari

Criando Mocks de serviços REST com SoapUI

27 de junho de 2017

Monise Costa

JavaScript 6: diferença entre var, let e const

09 de maio de 2017

Otávio Felipe do Prado

Deixe seu comentário