Nota del autor

Si la entrada que estás leyendo carece de imágenes, no se ve el vídeo que teóricamente lleva incrustado o el código fuente mostrado aparece sin formato, podéis conocer los motivos aquí. Poco a poco iré restableciendo la normalidad en el blog.
Este blog es un archivo de los artículos situados previamente en Lobosoft.es y ha dejado de ser actualizado. Las nuevas entradas pueden encontrarse en www.lobosoft.es. Un saludo,
Lobosoft.

lunes, 23 de junio de 2008

Firma digital de XML

La firma digital de documentos XML es una recomendación de la W3C que define una sintaxis XML para las firmas digitales. Dada la expansión de XML como soporte para tecnologías web (SOAP, SAML, etc.) así como para para el intercambio de información en general, resulta interesante conocer un poco más a fondo esta recomendación de la W3C.


Una firma XML sigue la estructura que reproducimos aquí, que no es otra que la ofrecida por W3C en su documento XMLDSig.



Signature
SignedInfo
SignatureMethod
CanonicalizationMethod
Reference
Transforms
DigestMethod
DigestValue
Reference ...

SignatureValue

KeyInfo

Object

Los elementos que presenta esta estructura son los siguientes:



  • SignedInfo especifica qué se firmó y con qué algoritmos. El SignatureMethod y CanonicalizationMethod elementos son utilizados por el elemento SignatureValue y se incluyen en SignedInfo para evitar una posible manipulación.

  • Reference Una lista de elementos de referencia recogen los recursos que se han firmado usando la URI de referencia. También especifica cualquier transformación que deba aplicarse a los recursos antes de aplicar el algoritmo has (en DigestMethod), y el resultado de aplicar a los recursos (codificada en DigestValue en Base64).

  • SignatureValue es la codificación en Base64 del valor de la firma generado según las especificaciones del método SignatureMethod de la clase SignedInfo, serializado por el elemento CanonicalizationMethod.

  • KeyInfo es un elemento opcional que permite obtener la clave necesaria para validar la firma. Habitualmente contiene un conjunto de certificados X.509.

  • Por último, Object contiene, de estar presente, contendrá los datos cifrados en caso de encontrarnos ante una firma con sobre (envolvente).


Respecto al CanonicalizationMethod, cabe indicar que es un poco más complejo de lo habitual, ya que por las características propias de XML los espacios en blanco son tratados como inexistentes dentro de las etiquetas (por ejemplo, sintácticamente los elementos y son iguales).


La validación de una firma XML sigue un procedimiento denominado Core Validation, o validación del núcleo. Básicamente consta de dos pasos:




  • Validación de referencias: Cada elemento Reference es verificado mediante el correspondiente recurso, aplicando aquellas transformaciones que sean necesarias. El resultado es comparado con el DigestValue almacenado. Si no coinciden, la validación será dada por errónea.

  • Validación de la firma: El elemento SignedInfo es serializado usando el método de canónico especificado en CanonicalizationMethod. La clave es recuperada habitualmente usando KeyInfo, y la firma validada mediante SignatureMethod.




En una próxima entrada veremos cómo poner en práctica estos conceptos para desarrollar una aplicación en .NET que permita firmar digitalmente documentos XML, así como validar si son correctos.

2 comentarios:

  1. Hola, una consulta. Cómo sería la estructura de un xml que es firmado dos veces? Es decir, un usuario aplica una firma y este xml es recibido por otro usuario, el cual lo debe volver a firmar. Si la primera firma es realizada en referencia a una URI, la segunda firma deberia buscar alguna URI que abarque los datos mas la primera firma?

    ResponderEliminar
  2. Buenas Paola.

    Si se aplica este algoritmo de forma recurrente, crearía una estructura "envolvente" por cada firma que aplicases. Es decir, la firma en sí es una especie de "sobre virtual" que engloba al XML que se le pasa como argumento. Sucesivas firmas irían "envolviendo" cada vez más el contenido del XML. Algo así:

    [signature2]
    [signature1]
    [xml content]
    [/signature1]
    [/signature2]


    Es lo que se llama firma envolvente o enveloping signature. En la firma digital puedes encontrarte, de todas formas, con tres escenarios distintos:

    Enveloping Signature: La firma XML envuelve al contenido que se firma.
    Detached Signature: El objeto que es firmado está separado de la firma XML.
    Enveloped Signature: El contenido que se desea firmar engloba a la firma.

    Por lo que puedes adaptar el código para que se ajuste al que más pueda resultarte de interés.

    Espero que el comentario te haya servido de ayuda.

    Un cordial saludo.

    ResponderEliminar