Chiffrement XML
Le chiffrement XML est une spécification développée par W3C en 2002 qui contient la procédure de chiffrement des données, la procédure de déchiffrement des données chiffrées, la syntaxe XML représentant les données chiffrées, les informations permettant de déchiffrer les données et une liste d'algorithmes de chiffrement, tels que triple DES, AES et RSA.
Vous pouvez appliquer le chiffrement XML à un élément XML, à un contenu d'élément XML et des données arbitraires, incluant un document XML. Par exemple, supposons que vous ayez besoin de chiffrer l'élément <CreditCard> affiché dans l'exemple 1.
Exemple 1: Document XML exemple :
<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>
Exemple 2 : Document XML avec une clé secrète commune :
L'exemple 2 affiche le document XML après chiffrement. L'élément <EncryptedData> représente l'élément <CreditCard> chiffré. L'élément <EncryptionMethod> décrit l'algorithme de chiffrement appliqué, qui est triple DES dans cet exemple. L'élément <KeyInfo> contient les informations permettant d'extraire une clé de déchiffrement, qui est un élément <KeyName> dans cet exemple. L'élément <CipherValue> contient le texte chiffré obtenu par la sérialisation et le chiffrement de l'élément <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>
Exemple 3 : Document XML chiffré avec la clé publique du destinataire :
Dans l'exemple 2, il est supposé que l'expéditeur et le destinataire ont une clé secrète commune. Si le destinataire dispose d'une paire de clés publique et privée, ce qui est communément le cas, l'élément <CreditCard> peut être chiffré comme décrit dans l'exemple 3. L'élément <EncryptedData> est identique à l'élément <EncryptedData> se trouvant dans l'exemple 2. Toutefois, l'élément <KeyInfo> contient un élément <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>
Chiffrement XML dans WSS-Core :
La spécification WSS-Core est en cours de développement par OASIS (Organization for the Advancement of Structured Information Standards). Elle décrit les améliorations des applications de messagerie SOAP visant à assurer la qualité de la protection à travers l'intégrité, la confidentialité des messages et une authentification unique des messages. La confidentialité des messages est assurée par le chiffrement XML.
La spécification WSS-Core supporte le chiffrement de toute combinaison de blocs de corps, de blocs d'en-tête, de leurs sous-structures et des pièces jointes d'un message SOAP. La spécification requiert également que lorsque vous chiffrez des éléments d'un message SOAP, vous devez ajouter une référence provenant du bloc d'en-têtes de sécurité aux éléments chiffrés du message. La référence peut aider un destinataire à identifier les éléments chiffrés du message à déchiffrer.
La syntaxe XML de la référence varie en fonction des informations chiffrées et de leur mode de chiffrement. Par exemple, supposons que l'élément <CreditCard> de l'exemple 4 soit chiffré avec une clé secrète commune ou avec la clé publique du destinataire.
Exemple 4 : Modèle de message SOAP version 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>
Les messages SOAP en résultant sont affichés dans les exemples 5 et 6. Dans ces exemples, les éléments <ReferenceList> et <EncryptedKey> sont utilisés en tant que références, respectivement.
Exemple 5 : Message SOAP version 1.1 chiffré avec une clé secrète commune
<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>
SOAP version 1.2 ne prend pas en charge encodingStyle ; l'exemple est donc remplacé par :
<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>
Exemple 6 : Message SOAP chiffré avec la clé publique du destinataire :
<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>
SOAP version 1.2 ne prend pas en charge encodingStyle ; l'exemple est donc remplacé par :
<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>
Relation à la signature numérique :
La spécification WSS-Core garantit également l'intégrité du message, qui est assurée par la spécification de signature numérique XML.
Une combinaison de chiffrement et de signature numérique pour des données communes entraîne des risques au niveau du chiffrement.
Chiffrement symétrique et chiffrement asymétrique
Pour un chiffrement XML, le serveur d'applications prend en charge deux types de chiffrement :
- Chiffrement symétrique
S'il s'agit d'une version du serveur d'applications antérieure à WebSphere Application Server Version 7 incluant le Feature Pack for Web Services de IBM® WebSphere Application Server Version 6.1, par défaut la référence KeyName a été utilisée comme référence de la clé partagée en dehors du message SOAP. Cependant, la norme Web Services Security (WS-Security) version 1.1 ne recommande pas l'utilisation de la référence KeyName. Dans la mesure où la référence KeyName n'est pas prise en charge par les règles de sécurité, elle n'est pas prise en charge dans le serveur d'applications.
La norme Web Services Secure Conversation (WS-SecureConversation) définit comment la clé partagée est échangée entre le client et le service et comment faire référence à la clé partagée dans le message. L'utilisation de Kerberos avec la sécurité des services Web, comme décrit dans le profil de jeton Kerberos, définit également comment utiliser une clé de session ou une clé dérivée de la clé de session pour effectuer le chiffrement symétrique. De ce fait, vous pouvez utiliser le chiffrement à l'aide de WS-SecureConversation ou de Kerberos. WebSphere Application Server prend en charge DerivedKeyToken lors de l'utilisation de WS-SecureConversation. Lors de l'utilisation de Kerberos, WebSphere Application Server prend en charge directement l'utilisation du jeton de clé dérivée (DerivedKeyToken) et de la clé de session Kerberos.
- Chiffrement asymétrique
Pour le chiffrement asymétrique, le chiffrement XML introduit le concept d'encapsulation de clé. Les données, telles que le contenu de l'élément de corps SOAP, sont chiffrées à l'aide d'une clé partagée qui est générée de façon dynamique pendant le traitement. La clé partagée générée est ensuite chiffrée à l'aide de la clé publique du destinataire. WebSphere Application Server prend en charge X509Token pour le chiffrement asymétrique.