340 likes | 580 Views
Seguridad (para desarrolladores). Firma digital XML. Mauricio Grimberg mau@mug.org.ar Axton http://www.axton.com.ar/. ¿Qué pretendemos asegurar?. Que quien “firma” el documento sea quien dice ser Equivalente exacto a una firma manual
E N D
Seguridad (para desarrolladores) Firma digital XML Mauricio Grimberg mau@mug.org.ar Axton http://www.axton.com.ar/
¿Qué pretendemos asegurar? • Que quien “firma” el documento sea quien dice ser • Equivalente exacto a una firma manual • Que el contenido que tenemos enfrente es el que el firmante firmó (perdón por el trabalenguas) • Verificación de que no hubo transformación posterior a la firma • No vamos a tocar en esta charla el tema encriptación general del contenido; lateralmente enfocaremos el tema encriptación en el marco de la operatoria de la firma.
En términos más técnicos pero no menos generales • Generaremos un nodo XML que contiene • Un resumen de todo lo que se quiere firmar • La indicación de cómo se preprocesa el material a firmar • La indicación de cómo se resume lo preprocesado • Una encriptación del resumen utilizando claves asimétricas
Algo así <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo> <!--La información firmada--> <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> <Reference URI=""> <Transforms> <!--Remueve del cálculo del compendio toda la estructura generada a partir de [Signature] --> <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> <DigestValue>2PCZb3vt8JaSdzzVZyenRoFU694=</DigestValue> </Reference> </SignedInfo> <SignatureValue>Afc+biLiXr5XGLHC1Iz5+Jnz4UaQzSx9seOj5ac+l+a7FlXAonZMaUd3f6pZ0zG46WdcXqoNq1Rl2noGTE2+uSjP8CSYeFdRFZMiIiq03u0xPx5eg5tU9iucRmH3NYmLEMDSbGnS2AYDc24lPsHRf2BtXbd/g9bufAh5CRrdLYc=</SignatureValue> </Signature>
Clave simétrica • Es una clave única • Se denomina simétrica porque la misma clave debe estar disponible para quien firma y para quien verifica la firma • Implica una necesidad importante de transportación de la clave • Esto desvaloriza el sistema: la clave está viajando todo el tiempo
Claves asimétricas • Clave pública • Clave privada • Tienen un funcionamiento complementario que permite utilizarlas de un modo asimétrico: firmo con la privada y verifico con la pública • La pública es PÚBLICA: la puedo distribuir a mi gusto • Rápidamente: si puedo verificar una firma usando una clave pública es porque quien la firmó tiene la clave privada
Claves e identidad • De nada sirve una clave no asociada a una determinada itentidad • En TODO caso “alguien” debe certificar – del mismo modo que un Banco certifica nuestra firma manual - la asociación entre Clave e Identidad
Verificación de identidad • Por certificado • Obtenemos un certificado generado por una entidad autorizada para asegurar que puede proveer un certificado único a una persona o empresa verificable • Es la manera estándar • Por clave • Generamos claves programáticamente y las almacenamos en una base de datos, la aplicación certifica el vínculo entre clave e identidad • Validez sólo interna
¿Qué es un certificado? Es un contenedor único - especificado de un modo estándar - de claves, información del sujeto, de la entidad autorizante y de los procedimientos asociados Definido por el grupo de trabajo Internet Engineering Task Force (IETF) Public Key Infrastructure, X.509 (PKIX) Es - finalmente - un mensaje en el que el autorizante asegura la identidad del titular
CA (certificate authority) • Modelo de confianza “absoluta” • Los proveedores de certificados (los CA) son quienes se responsabilizan por la identificación e integridad del certificado “hacia todos”, en todo contexto
No repudiable • El hecho de la certificación universal producida por un certificado produce el tercer valor de la firma digital • Integridad • Identificación • No repudiabilidad
X.509 • Es una colección de especificaciones para estandarizar la metodología de clave pública • Contiene ambas claves (o sólo la pública) y más información destinada a procesos de identificación de entidades y algoritmos bajo la forma de un certificado
X.509 • Version • Versión de X.509 • Serial Number • Según RFC 2459 es un número entero que identifica absolutamente a un certificado en el contexto de un determinado CA • Algorithm ID • Algoritmo de encriptación utilizado • Issuer • Emisor del certificado
X.509 • Not Before • Inicio de validez (fecha) • Not After • Fin de validez (fecha) • Subject • Nombre distinguible del sujeto • Public Key Info • Información de clave
Generación de certificados • A los fines del desarrollo generaremos uno utilizando Makecert • Luego lo podremos examinar utilizando MMC (Microsoft Management Console) mediante el snap-in Certificates
Makecert • .Net Framework SDK 2.0 contiene la última versión • Generamos un certificado que incluye una clave privada, denominación del titular, fechas de vigencia y lo enviamos al almacenamiento personal • makecert -r -pe -n "CN=XML_DIG_SIGN_Mauricio" -b 11/28/2005 -e 11/28/2010 -sky exchange -ss my
SHA1 • Secure Hash Algorithm - Version 1.0 • http://www.w3.org/PICS/DSig/SHA1_1_0.html • Algoritmo diseñado para ser usado con firma digital - Digital Signature Standard (DSS) – con el objetivo de generar un resumen del contenido a firmar
RSA • Es un algoritmo de encriptación asimétrica • Generado en 1977 por Ron Rivest, Adi Shamir y Len Adleman - las iniciales de sus apellidos componen su nombre - en el MIT • Junto con Sha1 son preferidos por el W3C para los usos de XML Digital Signature • (<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>)
Firma digital • Detached • Desconectada • Enveloping • Envolvente: la información firmada está embebida • Enveloped • Envuelta: el documento contiene la firma
Proceso de firma • Generación de referencias • Aplicar las transformaciones • Calcular los compendios • Agregar los respectivos elementos Reference • Generación de la firma • Construir SignedInfo • Construir SignatureValue • Construir el nodo principal y, eventualmente, agregar información de claves públicas o certificados
Proceso de validación de firma • Construir el resumen utilizando el algoritmo especificado • Si coincide continuamos • Obtenemos la información de claves • Utilizamos el algoritmo de encriptación asimétrica para validar la firma
Canonicalization • Los algoritmos de criptografía esperan textos exactos (inmodificados) como condición de igualdad • XML tiene flexibilidades en la condición de igualdad: • Espacios en blanco • Orden de los atributos
Estructura de la Firma de ejemplo • Signature • SignedInfo • CanonicalizationMethod • SignatureMethod • El método de firma también se firma • Reference • Transforms • DigestMethod • DigestValue • SignatureValue
Elementos • Signature • Raíz de la firma • SignedInfo • La información efectivamente firmada • Transforms • Pasos de transformación: XPATH, XSL, etc. • CanonicalizationMethod • El algoritmo usado para canonicalizar
Elementos 2 • Reference • Cada recurso del documento a ser firmado • Puede incluir múltiples transformaciones • DigestMethod • El algoritmo utilizado para producir el DigestValue • SignatureValue • El resultado de aplicar la clave al DigestValue utilizando el agoritmo del SignatureMethod • KeyInfo • Información (opcional) sobre la clave
Estadios Firma Canonicalization Transforms DigestMethod SignedInfo DigestValue Verificación DigestValue DigestMethod. SignedInfo SignatureValue KeyInfo
Multiplicidad • Múltiples transformaciones • Detalladas en cada elemento Transform • Múltiples referencias • Puede utilizarse un manifiesto (colección de referencias) en caso de que sean muchas
Obtener el certificado (VB) Public Function ObtenerCertificado(ByVal subject As String) As X509Certificate2 Dim store As New X509Store(StoreLocation.CurrentUser) store.Open(OpenFlags.ReadOnly) Dim certCollection As X509Certificate2Collection = store.Certificates Dim cert As X509Certificate2 = Nothing Dim c As X509Certificate2 For Each c In certCollection If c.Subject = subject Then Return c End If Next c Return Nothing End Function
Obtener el certificado (C#) public static X509Certificate2 ObtenerCertificado(String subject) { X509Store store = new X509Store(StoreLocation.CurrentUser); store.Open(OpenFlags.ReadOnly); X509Certificate2Collection certCollection = store.Certificates; foreach (X509Certificate2 c in certCollection) { if (c.Subject == subject) { return c; } } return null; }
Firmar digitalmente (VB) Public Sub FirmarXML(ByRef documento As XmlDocument, ByVal certificado As X509Certificate2) Dim sig As SignedXml = New SignedXml(documento) sig.SigningKey = certificado.PrivateKey Dim reference As New Reference() reference.Uri = "" Dim env As New XmlDsigEnvelopedSignatureTransform() reference.AddTransform(env) sig.AddReference(reference) sig.ComputeSignature() Dim xmlDigitalSignature As XmlElement = sig.GetXml() documento.DocumentElement.AppendChild(documento.ImportNode(xmlDigitalSignature, True)) End Sub
Firmar digitalmente (C#) public static void FirmarXML(ref XmlDocument documento, X509Certificate2 certificado) { SignedXml sig = new SignedXml(documento); sig.SigningKey = certificado.PrivateKey; Reference reference = new Reference(); reference.Uri = ""; XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform(); reference.AddTransform(env); sig.AddReference(reference); sig.ComputeSignature(); XmlElement xmlDigitalSignature = sig.GetXml(); documento.DocumentElement.AppendChild(documento.ImportNode(xmlDigitalSignature, true)); }
Verificar Firma (VB) Public Function VerificarFirma(ByVal documento As XmlDocument, ByVal certificado As X509Certificate2) As Boolean Dim sig As SignedXml = New SignedXml(documento) Dim nodeList As XmlNodeList = documento.GetElementsByTagName("Signature") sig.LoadXml(CType(nodeList(0), XmlElement)) Return sig.CheckSignature(certificado, True) End Function
Verificar Firma (C#) static Boolean VerificarFirma(XmlDocument documento, X509Certificate2 certificado) { SignedXml sig = new SignedXml(documento); XmlNodeList nodeList = documento.GetElementsByTagName("Signature"); sig.LoadXml((XmlElement)nodeList[0]); return sig.CheckSignature(certificado, true); }
Vínculos • http://world.std.com/~franl/crypto/rsa-example.html • http://www.codeproject.com/dotnet/xmldsiglic.asp • http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwebsrv/html/underxmldigsig.asp • http://www.jensign.com/ • EL VÍNCULO: http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/Overview.html