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.
Mostrando entradas con la etiqueta XML. Mostrar todas las entradas
Mostrando entradas con la etiqueta XML. Mostrar todas las entradas

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.