La firma XML (también llamada XMLDSig , XML-DSig , XML-Sig ) define una sintaxis XML para firmas digitales y está definida en la recomendación del W3C XML Signature Syntax and Processing. Funcionalmente, tiene mucho en común con PKCS #7 pero es más extensible y está orientado a firmar documentos XML. Es utilizado por diversas tecnologías web como SOAP , SAML y otras.
Las firmas XML se pueden utilizar para firmar datos (un recurso ) de cualquier tipo , normalmente documentos XML, pero se puede firmar cualquier cosa a la que se pueda acceder a través de una URL . Una firma XML utilizada para firmar un recurso fuera del documento XML que lo contiene se denomina firma separada ; si se utiliza para firmar alguna parte del documento que lo contiene, se llama firma en sobre ; [1] si contiene los datos firmados dentro de sí mismo, se denomina firma envolvente . [2]
Una firma XML consta de un Signature
elemento en el http://www.w3.org/2000/09/xmldsig#
espacio de nombres. La estructura básica es la siguiente:
<Firma> <SignedInfo> <CanonicalizationMethod /> <SignatureMethod /> <Reference> <Transforms /> <DigestMethod /> <DigestValue /> </Reference> <Reference /> etc. </SignedInfo> <SignatureValue /> <KeyInfo / > <Objeto /> </Firma>
SignedInfo
elemento contiene o hace referencia a los datos firmados y especifica qué algoritmos se utilizan.SignatureMethod
y CanonicalizationMethod
son utilizados por el SignatureValue
elemento y se incluyen SignedInfo
para protegerlos contra manipulaciones.Reference
elementos especifican el recurso que se firma mediante referencia de URI y cualquier transformación que se aplicará al recurso antes de la firma.Transforms
contiene las transformaciones aplicadas al recurso antes de la firma. Una transformación puede ser una expresión XPath que selecciona un subconjunto definido del árbol del documento. [3]DigestMethod
especifica el algoritmo hash antes de aplicar el hash.DigestValue
contiene el resultado codificado en Base64 de aplicar el algoritmo hash a los recursos transformados definidos en los Reference
atributos del elemento.SignatureValue
elemento contiene el resultado de la firma codificada en Base64 (la firma generada con los parámetros especificados en el SignatureMethod
elemento) del SignedInfo
elemento después de aplicar el algoritmo especificado por el archivo CanonicalizationMethod
.KeyInfo
Opcionalmente, el elemento permite al firmante proporcionar a los destinatarios la clave que valida la firma, generalmente en forma de uno o más certificados digitales X.509 . La parte que confía debe identificar la clave a partir del contexto si KeyInfo
no está presente.Object
elemento (opcional) contiene los datos firmados si se trata de una firma envolvente .Al validar una firma XML, se sigue un procedimiento llamado Core Validation .
Reference
resumen se verifica recuperando el recurso correspondiente y aplicándole cualquier transformación y luego el método de resumen especificado. El resultado se compara con el registrado DigestValue
; si no coinciden, la validación falla.SignedInfo
elemento se serializa utilizando el método de canonicalización especificado en CanonicalizationMethod
, los datos clave se recuperan utilizando KeyInfo
o por otros medios y la firma se verifica utilizando el método especificado en SignatureMethod
.Este procedimiento establece si los recursos fueron realmente firmados por el presunto partícipe. Sin embargo, debido a la extensibilidad de los métodos de canonicalización y transformación, la parte verificadora también debe asegurarse de que lo que realmente se firmó o digirió es realmente lo que estaba presente en los datos originales, en otras palabras, que se puede confiar en los algoritmos utilizados allí, no para cambiar el significado de los datos firmados.
Debido a que la estructura del documento firmado puede ser alterada y provocar ataques de "envoltura de firma", el proceso de validación también debe cubrir la estructura del documento XML. El elemento firmado y el elemento de firma deben seleccionarse utilizando una expresión XPath absoluta , no getElementByName
métodos. [4]
La creación de firmas XML es sustancialmente más compleja que la creación de una firma digital ordinaria porque un documento XML determinado (un " conjunto de información ", de uso común entre los desarrolladores de XML) puede tener más de una representación serializada legal. Por ejemplo, el espacio en blanco dentro de un elemento XML no es sintácticamente significativo, por lo que <Elem >
es sintácticamente idéntico a <Elem>
.
Dado que la firma digital garantiza la integridad de los datos, una diferencia de un solo byte haría que la firma varíe. Además, si un documento XML se transfiere de una computadora a otra, el terminador de línea puede cambiarse de CR a LF a CR LF, etc. Un programa que digiera y valide un documento XML puede luego representar el documento XML de una manera diferente, por ejemplo agregando espacio excesivo entre definiciones de atributos con una definición de elemento, o usando URL relativas (vs. absolutas), o reordenando las definiciones de espacios de nombres. El XML canónico es especialmente importante cuando una firma XML hace referencia a un documento remoto, que un servidor remoto errante puede representar de forma variable en el tiempo.
Para evitar estos problemas y garantizar que los documentos XML lógicamente idénticos proporcionen firmas digitales idénticas, se emplea una transformación de canonicalización XML (frecuentemente abreviada C14n ) al firmar documentos XML (para firmar SignedInfo
, una canonicalización es obligatoria). Estos algoritmos garantizan que los documentos semánticamente idénticos produzcan representaciones serializadas exactamente idénticas.
Otra complicación surge debido a la forma en que el algoritmo de canonicalización predeterminado maneja las declaraciones de espacios de nombres; frecuentemente es necesario incrustar un documento XML firmado en otro documento; en este caso, el algoritmo de canonicalización original no producirá el mismo resultado que si el documento se tratara solo. Por esta razón, se creó la llamada Canonicalización Exclusiva , que serializa declaraciones de espacios de nombres XML independientemente del XML circundante.
La firma XML es más flexible que otras formas de firmas digitales como Pretty Good Privacy y Cryptographic Message Syntax , porque no opera sobre datos binarios , sino sobre el conjunto de información XML , lo que permite trabajar sobre subconjuntos de datos (esto también es posible con datos binarios de formas no estándar, por ejemplo codificando bloques de datos binarios en base64 ASCII), teniendo varias formas de vincular la firma y la información firmada, y realizar transformaciones. Otro concepto central es la canonicalización, es decir, firmar sólo la "esencia", eliminando diferencias sin sentido como espacios en blanco y finales de línea.
Hay críticas dirigidas a la arquitectura de seguridad XML en general [5] y a la idoneidad de la canonicalización XML en particular como interfaz para firmar y cifrar datos XML debido a su complejidad, requisitos de procesamiento inherentes y características de rendimiento deficientes. [6] [7] [8] El argumento es que realizar la canonicalización XML provoca una latencia excesiva que es simplemente demasiado difícil de superar para aplicaciones SOA transaccionales y sensibles al rendimiento.
Estas cuestiones se están abordando en el Grupo de Trabajo de Seguridad XML. [9] [10]
Sin una política e implementación adecuadas [4], el uso de XML Dsig en SOAP y WS-Security puede generar vulnerabilidades, [11] como el ajuste de firmas XML. [12]
Un ejemplo de aplicaciones de Firmas XML: