cifrado XML

El cifrado XML es una especificación desarrollada por W3C (World Wide Web Consortium) en 2002 que contiene los pasos necesarios para cifrar datos, los pasos necesarios para descifrar datos cifrados, la sintaxis XML para representar datos cifrados, la información utilizada para descifrar los datos, y una lista de algoritmos de cifrado como DES triple, AES y RSA.

Puede aplicar el cifrado XML a un elemento XML, el contenido del elemento XML y datos arbitrarios, incluido un documento XML. Por ejemplo, supongamos que necesita cifrar el elemento <CreditCard> que se muestra en el ejemplo 1.

Ejemplo 1: Documento XML de ejemplo

<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>

Ejemplo 2: Documento XML con una clave secreta común

El ejemplo 2 muestra el documento XML después del cifrado. El elemento <EncryptedData> representa el elemento <CreditCard> cifrado. El elemento <EncryptionMethod> describe el algoritmo de cifrado aplicado, que es DES triple en este ejemplo. El elemento <KeyInfo> contiene la información necesaria para recuperar una clave de cifrado, que es un elemento <KeyName> en este ejemplo. El elemento <CipherValue> contiene el texto de cifrado que se obtiene al serializar y cifrar el 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>

Ejemplo 3: Documento XML cifrado con la clave pública del destinatario

En el ejemplo 2, suponemos que el remitente y el destinatario tienen una clave secreta común. Si el destinatario tiene un par de claves pública y privada, que es el caso más probable, el elemento <CreditCard> se puede cifrar como se muestra en el ejemplo 3. El elemento <EncryptedData> es el mismo que el elemento <EncryptedData> que se encuentra en el ejemplo 2. No obstante, el elemento <KeyInfo> contiene un <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>

Cifrado XML en WSS-Core:

La especificación WSS-Core está siendo desarrollada por OASIS (Organization for the Advancement of Structured Information Standards). La especificación describe las mejoras en la mensajería SOAP para aumentar la calidad de protección gracias a la integridad de los datos, la confidencialidad de los mensajes y la autenticación de mensajes individuales. La confidencialidad de los mensajes se consigue mediante el cifrado basado en XML.

La especificación WSS-Core da soporte al cifrado de cualquier combinación de bloques de cuerpos, bloques de cabeceras, las subestructuras y los adjuntos de un mensaje SOAP. La especificación también necesita que cuando se cifren las partes de un mensaje SOAP, se coloque como prefijo una referencia del bloque de cabecera de seguridad en las partes cifradas del mensaje. La referencia puede ser una pista para que el destinatario identifique qué partes cifradas del mensaje debe descifrar.

La sintaxis XML de la referencia varía según qué información esté cifrada y cómo se cifre. Por ejemplo, supongamos que el elemento <CreditCard> del ejemplo 4 se cifra con una clave secreta común o con la clave pública del destinatario.

Ejemplo 4: Mensaje SOAP Versión 1.1 de ejemplo

<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 Versión 1.2 no da soporte a encodingStyle, por lo que el ejemplo cambia al siguiente:
<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>

Los mensajes SOAP resultantes se muestran en los ejemplos 5 y 6. En estos ejemplos, los elementos <ReferenceList> y <EncryptedKey> se utilizan respectivamente como referencias.

Ejemplo 5: Mensaje SOAP Versión 1.1 cifrado con una clave secreta común

<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 Versión 1.2 no da soporte a encodingStyle y el ejemplo cambia al siguiente:

<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>

Ejemplo 6: Mensaje SOAP cifrado con la clave pública del destinatario

<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 Versión 1.2 no da soporte a encodingStyle y el ejemplo cambia al siguiente:

<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>

Relación con la firma digital

La especificación WSS-Core también proporciona la integridad de mensajes, que se obtiene mediante una firma digital basada en la especificación de firma XML.

Una combinación de cifrado y firma digital en datos comunes introduce vulnerabilidades criptográficas.

Cifrado simétrico y cifrado asimétrico

Para el cifrado XML, el servidor de aplicaciones soporta dos tipos de cifrado:

  • Cifrado simétrico

    En releases del servidor de aplicaciones anteriores a WebSphere Application Server Versión 7, incluido el paquete de características de IBM® WebSphere Application Server Versión 6.1 para servicios web, se ha utilizado de manera predeterminada la referencia KeyName para referirse a la clave compartida fuera del mensaje SOAP. No obstante, el estándar WS-Security (Web Services Security) Versión 1.1 no recomienda utilizar la referencia KeyName. Como KeyName no está soportado por la política de seguridad, no está soportado en el servidor de aplicaciones.

    El estándar WS-SecureConversation (Web Services Secure Conversation) define cómo intercambiar la clave compartida entre el cliente y el servicio y cómo hacer referencia a la clave compartida en el mensaje. El uso de Kerberos con la seguridad de servicios web, descrito en el perfil de señales de Kerberos, define también cómo utilizar una clave de sesión de Kerberos o una clave derivada de la clave de sesión para realizar un cifrado simétrico. Por lo tanto, puede utilizar el cifrado simétrico utilizando WS-SecureConversation o Kerberos. WebSphere Application Server da soporte a DerivedKeyToken cuando utiliza WS-SecureConversation. Cuando se utiliza Kerberos, WebSphere Application Server permite utilizar directamente las claves de sesión DerivedKeyToken y Kerberos.

  • Cifrado asimétrico

    Para el cifrado asimétrico, el cifrado XML introduce la idea de la envoltura de claves. Los datos como, por ejemplo, el contenido del elemento de cuerpo SOAP, se cifran con una clave compartida que se genera dinámicamente durante el proceso. A continuación, la clave compartida generada se cifra con la clave pública del destinatario. WebSphere Application Server da soporte a X509Token para el cifrado asimétrico.


Icon that indicates the type of topic Concept topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cwbs_encryptv6
File name: cwbs_encryptv6.html