Introducción A medida que la tecnología XML se extiende, cada vez

Anuncio
Introducción
A medida que la tecnología XML se extiende, cada vez más información se distribuye en este formato.
Pero XML nació como formato de documentos y en sí mismo no contiene elementos relacionados con la
seguridad. Esto hace necesario realizar un esfuerzo concreto en esta materia, en una búsqueda para
encontrar un método para proteger esa información compartida.
XML Encryption es una Recomendación del Consorcio Web que especifica un proceso para encriptar
datos (no únicamente documentos XML) y representar esa información encriptada a su vez en XML para
que viaje por los medios de transmisión. Este artículo pretende describir y ejemplificar someramente su
funcionamiento, para información detallada acudir a la Especificación del Consorcio Web.
Aspectos Generales
XML Encryption establece que para encriptar un elemento (o un contenido textual de un elemento), este
va a ser sustituido por otro elemento establecido por la especificación que contendrá el dato encriptado y
la información necesaria para el procesamiento, como puede ser la identificación del algoritmo utilizado o
datos sobre la clave empleada. Este elemento es <EncryptedData>, de tal modo que podría aparecer como
raíz del nuevo documento generado tras el proceso, o como hijo de otros elementos ya existentes
previamente.
Por otro lado, la especificación establece XML Schema como esquema de modelo de datos. Dicho
Schema puede ser consultado en la especificación de XML Encryption y es necesario para conocer la
sintaxis a emplear.
La versión actual de XML Encryption utiliza el siguiente espacio de nombres:
xmlns:xenc='http://www.w3.org/2001/04/xmlenc#'
Granularidad de la encriptación de documentos XML
XML Encryption establece que es posible encriptar datos a distintos niveles de granularidad, desde
elementos simples hasta documentos enteros. Puede verse fácilmente con un ejemplo bastante intuitivo,
obtenido directamente del Consorcio Web. Supongamos que disponemos del siguiente documento XML:
<?xml version='1.0'?>
<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>
Se trata de una información de pago que contiene datos sobre una tarjeta de crédito: un cliente llamado
John Smith dispone de una tarjeta de crédito, cuyo número es 4019 2445 0277 5567, con un limite de
5000 USD y con fecha de expiración. Esta información es delicada y debería ser protegida.
Veamos unos ejemplos de diferentes niveles de encriptación para ese documento…
Encriptando un elemento
Podemos encriptar únicamente el elemento <creditcard> y dejar el nombre del cliente intacto, obteniendo
lo siguiente:
<?xml version='1.0'?>
<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#'>
<CipherData>
<CipherValue>A23B45C56</CipherValue>
</CipherData>
</EncryptedData>
</PaymentInfo>
Al encriptar totalmente el elemento <creditcard>, incluyendo sus etiquetas, la identidad del elemento
permanece oculta. Esto ofrece una interesante posibilidad para la seguridad ya que en principio no se
sabrá cuál es el medio de pago hasta que no se desencripte el dato.
Encriptando elementos hijos
Podemos optar por no encriptar todo el elemento <creditcard> sino algunos datos en concreto: el número,
el banco y la fecha de expiración.
<?xml version='1.0'?>
<PaymentInfo xmlns='http://example.org/paymentv2'>
<Name>John Smith</Name>
<CreditCard Limit='5,000' Currency='USD'>
<EncryptedData xmlns='http://www.w3.org/2001/04/xmlenc#'
Type='http://www.w3.org/2001/04/xmlenc#Content'>
<CipherData>
<CipherValue>A23B45C56</CipherValue>
</CipherData>
</EncryptedData>
</CreditCard>
</PaymentInfo>
Ahora vemos que el elemento <creditcard> permanece visible pero no los datos que queríamos ocultar.
Encriptando contenido textual
Si queremos proteger únicamente el número de tarjeta de crédito (es decir, el contenido textual del
elemento <number>) obtendríamos lo siguiente:
<?xml version='1.0'?>
<PaymentInfo xmlns='http://example.org/paymentv2'>
<Name>John Smith</Name>
<CreditCard Limit='5,000' Currency='USD'>
<Number>
<EncryptedData xmlns='http://www.w3.org/2001/04/xmlenc#'
Type='http://www.w3.org/2001/04/xmlenc#Content'>
<CipherData>
<CipherValue>A23B45C56</CipherValue>
</CipherData>
</EncryptedData>
</Number>
<Issuer>Example Bank</Issuer>
<Expiration>04/02</Expiration>
</CreditCard>
</PaymentInfo>
Vemos que toda la información permanece intacta excepto el contenido textual del elemento <number>
que contenía el dato a proteger.
Encriptando documentos enteros
Si se necesita que toda la información sea protegida es posible encriptar todo un documento XML. Si lo
hacemos con el documento de nuestro ejemplo se obtiene lo siguiente:
<?xml version='1.0'?>
<EncryptedData xmlns='http://www.w3.org/2001/04/xmlenc#'
MimeType='text/xml'>
<CipherData>
<CipherValue>A23B45C56</CipherValue>
</CipherData>
</EncryptedData>
Ahora, toda la información ha sido encriptada.
Super-encriptación (encriptando datos previamente encriptados)
Dado que es posible encriptar cualquier tipo de información, nada nos impide encriptar datos que ya
estaban encriptados. Esto se conoce como Super-encriptación y puede ser utilizada siempre que se respete
la siguiente limitación: se debe encriptar el elemento <encrypteddata> al completo.
Encriptar el contenido textual o elementos hijos del mismo tendría como resultado un documento XML
inválido frente al Schema que define XML Encryption, ya que según este esquema un elemento
<encrypteddata> no puede ser padre o hijo de otro elemento <encrypteddata>. Será necesario pues tener
en cuenta esa limitación a la hora de utilizar esta posibilidad de doble encriptación.
Sintaxis de XML Encryption
Normalmente el aspecto de un documento XML encriptado será bastante más complejo que el que hemos
visto en los ejemplos anteriores. El Schema que modeliza toda esa sintaxis es relativamente extenso y da
cobertura a multitud de aspectos relacionados con la criptografía, empleando para ello un conjunto de
elementos y atributos especiales.
Por ejemplo para conocer el método de encriptación empleado se utiliza el elemento
<encryptionmethod>. Si este elemento no existe el destinatario del mensaje encriptado debe saber de
antemano cuál fue el algoritmo utilizado.
Los datos encriptados propiamente dichos se engloban en elementos <cipherdata>, representando el
contenido en Base 64.
El manejo de las claves también tiene su propia estructura, pero también se emplean partes propias de
XML Signature (otro trabajo del W3C). Por ejemplo se puede asociar una cadena de caracteres visible a
una clave secreta que sólo conozcan el emisor y el receptor de antemano. Esta cadena se incrusta en el
elemento <keyname> y así el receptor sabrá que clave utilizar para desencriptar la información (una
interesante forma de evitar enviar las claves secretas por medios de comunicación inseguros).
Por otro lado, si optamos por enviar la clave junto con el documento, será recomendable que la
encriptemos a su vez; se utiliza para ello el elemento <encryptedkey> para transportarla en el documento.
Esto nos servirá para poder enviar la clave propiamente dicha junto con el documento de un modo seguro.
Existen más elementos y atributos específicos que aportan más información para el procesamiento de
XML Encryption. Hay que tener en cuenta que, como se ha comentado antes, muchas de esos métodos
pertenecen no a XML Encryption propiamente dicho sino a XML Signature.
Algoritmos reconocidos
Dado que XML Encryption involucra muchos aspectos sobre criptografía y seguridad en general, se ha
hecho una clasificación de los algoritmos reconocidos y de cuál es su misión en el procesamiento.
Para el cifrado de los datos se admiten diversos algoritmos de criptografía entre los cuales figuran
TripleDES, AES y RSA. Cada uno debe ser referido en el documento encriptado mediante un
identificador destinado a ello y que está definido en la especificación.
El transporte de las claves (Key Transport) queda a cargo de los algoritmos RSA-v1.5 y RSA-OAEP
obligatoriamente. Su función es un encriptado asimétrico (clave pública) diseñado específicamente para
encriptar y desencriptar claves.
Para la autenticación de los mensajes (Message Authentication) el grupo de trabajo recomienda utilizar
XML Signature, otro trabajo del Consorcio Web.
La canonicalización (Canonicalization) del documento XML se describe en el Canonical XML, otro
trabajo del Consorcio Web. Este proceso consiste en serializar un documento XML en un flujo de octetos,
paso necesario para la encriptación.
Por último se establece que la codificación de los datos se haga obligatoriamente en Base64.
Existen más algoritmos y métodos reconocidos por XML Encryption que los aquí comentados… para
conocerlos en detalle debemos acudir a la especificación.
Descargar