Criptografia XML
A criptografia XML é uma especificação desenvolvida pelo W3C (World Wide Web Consortium) em 2002 e que contém as etapas para criptografar dados, as etapas para decriptografar os dados criptografados, a sintaxe XML para representar os dados criptografados, as informações a serem utilizadas para decriptografar os dados e uma lista de algoritmos de criptografia, como o triplo DES, AES e RSA.
É possível aplicar a criptografia XML a um elemento de XML, ao conteúdo de um elemento de XML e a dados arbitrários, incluindo um documento XML. Por exemplo, suponha que você precise criptografar o elemento <CreditCard> mostrado no exemplo 1.
Exemplo 1: Documento XML de amostra:
<PaymentInfo xmlns='http://example.org/paymentv2'>
<Name>John Smith</Name>
<CreditCard Limit='5,000' Currency='USD'>
<Number>4019 2445 0277 5567</Number>
<Issuer>Example Bank</Issuer>
<Expiration>04/02</Expiration>
</CreditCard>
</PaymentInfo>
Exemplo 2: Documento XML com uma chave secreta comum:
O Exemplo 2 mostra o documento XML após a criptografia. O elemento <EncryptedData> representa o elemento <CreditCard> criptografado. O elemento <EncryptionMethod> descreve o algoritmo de criptografia aplicado, que é DES triplo nesse exemplo. O elemento <KeyInfo> contém as informações necessárias para recuperar uma chave de decriptografia, que é um elemento <KeyName> nesse exemplo. O elemento <CipherValue> contém o texto cifrado obtido pela serialização e criptografia do elemento <CreditCard>.
<PaymentInfo xmlns='http://example.org/paymentv2'>
<Name>John Smith</Name>
<EncryptedData Type='http://www.w3.org/2001/04/xmlenc#Element'
xmlns='http://www.w3.org/2001/04/xmlenc#'>
<EncryptionMethod
Algorithm='http://www.w3.org/2001/04/xmlenc#tripledes-cbc'/>
<KeyInfo xmlns='http://www.w3.org/2000/09/xmldsig#'>
<KeyName>John Smith</KeyName>
</KeyInfo>
<CipherData>
<CipherValue>ydUNqHkMrD...</CipherValue>
</CipherData>
</EncryptedData>
</PaymentInfo>
Exemplo 3: Documento XML criptografado com a chave pública do destinatário:
No exemplo 2, supõe-se que o emissor e o destinatário tenham uma chave secreta comum. Se o destinatário tiver um par de chaves pública e privada, que é, geralmente, o caso, o elemento <CreditCard> poderá ser criptografado conforme mostrado no exemplo 3. O elemento <EncryptedData> é o mesmo elemento <EncryptedData> localizado no exemplo 2. No entanto, o elemento <KeyInfo> contém um elemento <EncryptedKey>.
<PaymentInfo xmlns='http://example.org/paymentv2'>
<Name>John Smith</Name>
<EncryptedData Type='http://www.w3.org/2001/04/xmlenc#Element'
xmlns='http://www.w3.org/2001/04/xmlenc#'>
<EncryptionMethod
Algorithm='http://www.w3.org/2001/04/xmlenc#tripledes-cbc'/>
<KeyInfo xmlns='http://www.w3.org/2000/09/xmldsig#'>
<EncryptedKey xmlns='http://www.w3.org/2001/04/xmlenc#'>
<EncryptionMethod
Algorithm='http://www.w3.org/2001/04/xmlenc#rsa-1_5'/>
<KeyInfo xmlns='http://www.w3.org/2000/09/xmldsig#'>
<KeyName>Sally Doe</KeyName>
</KeyInfo>
<CipherData>
<CipherValue>yMTEyOTA1M...</CipherValue>
</CipherData>
</EncryptedKey>
</KeyInfo>
<CipherData>
<CipherValue>ydUNqHkMrD...</CipherValue>
</CipherData>
</EncryptedData>
</PaymentInfo>
Criptografia XML No Núcleo do WSS:
A especificação WSS-Core está em desenvolvimento pela OASIS (Organization for the Advancement of Structured Information Standards). A especificação descreve aprimoramentos para mensagens SOAP para fornecer qualidade de proteção através de integridade, confidencialidade e autenticação única de mensagens. A confidencialidade de mensagem é realizada pela criptografia baseada em Criptografia XML.
A especificação WSS-Core suporta a criptografia de qualquer combinação de blocos de corpo, blocos de cabeçalho, suas subestruturas e anexos de uma mensagem SOAP. Quando você criptografa partes de uma mensagem SOAP, a especificação também requer que seja anexada no início uma referência do bloco de cabeçalho de segurança às partes criptografadas da mensagem. A referência pode ser uma pista para um destinatário para identificar quais partes criptografadas da mensagem devem ser descriptografadas.
A sintaxe XML da referência varia de acordo com que informações estão criptografadas e como elas estão criptografadas. Por exemplo, suponha que o elemento <CreditCard> no exemplo 4 esteja criptografado com uma chave secreta comum ou com a chave pública do destinatário.
Exemplo 4: Mensagem de amostra do SOAP Versão 1.1:
<SOAP-ENV:Envelope
SOAP-ENV:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'
xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>
<SOAP-ENV:Body>
<PaymentInfo xmlns='http://example.org/paymentv2'>
<Name>John Smith</Name>
<CreditCard Limit='5,000' Currency='USD'>
<Number>4019 2445 0277 5567</Number>
<Issuer>Example Bank</Issuer>
<Expiration>04/02</Expiration>
</CreditCard>
</PaymentInfo>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>
<SOAP-ENV:Body>
<PaymentInfo xmlns='http://example.org/paymentv2'>
<Name>John Smith</Name>
<CreditCard Limit='5,000' Currency='USD'>
<Number>4019 2445 0277 5567</Number>
<Issuer>Example Bank</Issuer>
<Expiration>04/02</Expiration>
</CreditCard>
</PaymentInfo>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
As mensagens SOAP resultantes são mostradas nos exemplos 5 e 6. Nesses exemplos, os elementos <ReferenceList> e <EncryptedKey> são utilizados como referências, respectivamente.
Exemplo 5: Mensagem SOAP Versão 1.1 criptografada como uma chave secreta comum
<SOAP-ENV:Envelope
xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>
<SOAP-ENV:Header>
<Security SOAP-ENV:mustUnderstand='1'
xmlns='http://schemas.xmlsoap.org/ws/2003/06/secext'>
<ReferenceList xmlns='http://www.w3.org/2001/04/xmlenc#'>
<DataReference URI='#ed1'/>
</ReferenceList>
</Security>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<PaymentInfo xmlns='http://example.org/paymentv2'>
<Name>John Smith</Name>
<EncryptedData Id='ed1'
Type='http://www.w3.org/2001/04/xmlenc#Element'
xmlns='http://www.w3.org/2001/04/xmlenc#'>
<EncryptionMethod
Algorithm='http://www.w3.org/2001/04/xmlenc#tripledes-cbc'/>
<KeyInfo xmlns='http://www.w3.org/2000/09/xmldsig#'>
<KeyName>John Smith</KeyName>
</KeyInfo>
<CipherData>
<CipherValue>ydUNqHkMrD...</CipherValue>
</CipherData>
</EncryptedData>
</PaymentInfo>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
O SOAP Versão 1.2 não suporta encodingStyle, e o exemplo é alterado para o seguinte:
<SOAP-ENV:Envelope
xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>
<SOAP-ENV:Header>
<Security SOAP-ENV:mustUnderstand='1'
xmlns='http://schemas.xmlsoap.org/ws/2003/06/secext'>
<ReferenceList xmlns='http://www.w3.org/2001/04/xmlenc#'>
<DataReference URI='#ed1'/>
</ReferenceList>
</Security>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<PaymentInfo xmlns='http://example.org/paymentv2'>
<Name>John Smith</Name>
<EncryptedData Id='ed1'
Type='http://www.w3.org/2001/04/xmlenc#Element'
xmlns='http://www.w3.org/2001/04/xmlenc#'>
<EncryptionMethod
Algorithm='http://www.w3.org/2001/04/xmlenc#tripledes-cbc'/>
<KeyInfo xmlns='http://www.w3.org/2000/09/xmldsig#'>
<KeyName>John Smith</KeyName>
</KeyInfo>
<CipherData>
<CipherValue>ydUNqHkMrD...</CipherValue>
</CipherData>
</EncryptedData>
</PaymentInfo>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Exemplo 6: Mensagem de SOAP criptografada com a chave pública do destinatário:
<SOAP-ENV:Envelope
SOAP-ENV:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'
xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>
<SOAP-ENV:Header>
<Security SOAP-ENV:mustUnderstand='1'
xmlns='http://schemas.xmlsoap.org/ws/2003/06/secext'>
<EncryptedKey xmlns='http://www.w3.org/2001/04/xmlenc#'>
<EncryptionMethod
Algorithm='http://www.w3.org/2001/04/xmlenc#rsa-1_5'/>
<KeyInfo xmlns='http://www.w3.org/2000/09/xmldsig#'>
<KeyName>Sally Doe</KeyName>
</KeyInfo>
<CipherData>
<CipherValue>yMTEyOTA1M...</CipherValue>
</CipherData>
<ReferenceList>
<DataReference URI='#ed1'/>
</ReferenceList>
</EncryptedKey>
</Security>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<PaymentInfo xmlns='http://example.org/paymentv2'>
<Name>John Smith</Name>
<EncryptedData Id='ed1'
Type='http://www.w3.org/2001/04/xmlenc#Element'
xmlns='http://www.w3.org/2001/04/xmlenc#'>
<EncryptionMethod
Algorithm='http://www.w3.org/2001/04/xmlenc#tripledes-cbc'/>
<CipherData>
<CipherValue>ydUNqHkMrD...</CipherValue>
</CipherData>
</EncryptedData>
</PaymentInfo>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
O SOAP Versão 1.2 não suporta encodingStyle, e o exemplo é alterado para o seguinte:
<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>
<SOAP-ENV:Header>
<Security SOAP-ENV:mustUnderstand='1'
xmlns='http://schemas.xmlsoap.org/ws/2003/06/secext'>
<EncryptedKey xmlns='http://www.w3.org/2001/04/xmlenc#'>
<EncryptionMethod
Algorithm='http://www.w3.org/2001/04/xmlenc#rsa-1_5'/>
<KeyInfo xmlns='http://www.w3.org/2000/09/xmldsig#'>
<KeyName>Sally Doe</KeyName>
</KeyInfo>
<CipherData>
<CipherValue>yMTEyOTA1M...</CipherValue>
</CipherData>
<ReferenceList>
<DataReference URI='#ed1'/>
</ReferenceList>
</EncryptedKey>
</Security>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<PaymentInfo xmlns='http://example.org/paymentv2'>
<Name>John Smith</Name>
<EncryptedData Id='ed1'
Type='http://www.w3.org/2001/04/xmlenc#Element'
xmlns='http://www.w3.org/2001/04/xmlenc#'>
<EncryptionMethod
Algorithm='http://www.w3.org/2001/04/xmlenc#tripledes-cbc'/>
<CipherData>
<CipherValue>ydUNqHkMrD...</CipherValue>
</CipherData>
</EncryptedData>
</PaymentInfo>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Relacionamento para assinatura digital:
A especificação WSS-Core também fornece a integridade da mensagem, que é realizada por uma assinatura digital baseada na especificação XML-Signature.
Uma combinação de criptografia e assinatura digital por dados comuns introduz vulnerabilidades criptográficas.
Criptografia simétrica versus assimétrica
Para criptografia XML, o servidor de aplicativos suporta dois tipos de criptografia:
- Criptografia Simétrica
Em releases do servidor de aplicativos anteriores ao WebSphere Application Server Versão 7, incluindo o IBM® WebSphere Application Server Versão 6.1 Feature Pack para Web Services, por padrão, a referência KeyName foi utilizada para referir-se à chave compartilhada fora da mensagem SOAP. Entretanto, o padrão WS-Security (Web Services Security) Versão 1.1 não recomenda o uso da referência KeyName. Como KeyName não é suportada pela política de segurança, ele não é suportado no servidor de aplicativos.
O padrão WS-SecureConversation (Web Services Secure Conversation) define como trocar a chave compartilhada entre o cliente e o serviço e como referir-se à chave compartilhada na mensagem. O uso de Kerberos com o Web Services Security, conforme descrito no Perfil do Token Kerberos, também define como utilizar uma chave de sessão do Kerberos ou uma chave derivada da chave de sessão para executar criptografia simétrica. Portanto, é possível utilizar a criptografia simétrica por meio do WS-SecureConversation ou de Kerberos. O WebSphere Application Server suporta DerivedKeyToken ao utilizar o WS-SecureConversation. Ao usar o Kerberos, o WebSphere Application Server suporta o uso de ambos, DerivedKeyToken e da chave de sessão do Kerberos diretamente.
- Criptografia Assimétrica
Para criptografia assimétrica, a Criptografia XML introduz a ideia de agrupamento de chave. Os dados, do tipo conteúdo do elemento de corpo SOAP, são criptografados com uma chave compartilhada, gerada dinamicamente durante o processamento. Em seguida, a chave compartilhada gerada é criptografada com a chave pública do receptor. O WebSphere Application Server suporta o X509Token para criptografia assimétrica.