1 / 34

Seguridad (para desarrolladores)

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

manning
Télécharger la présentation

Seguridad (para desarrolladores)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Seguridad (para desarrolladores) Firma digital XML Mauricio Grimberg mau@mug.org.ar Axton http://www.axton.com.ar/

  2. ¿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.

  3. 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

  4. 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>

  5. 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

  6. 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

  7. 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

  8. 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

  9. ¿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

  10. 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

  11. 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

  12. 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

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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

  18. 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"/>)

  19. Firma digital • Detached • Desconectada • Enveloping • Envolvente: la información firmada está embebida • Enveloped • Envuelta: el documento contiene la firma

  20. 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

  21. 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

  22. 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

  23. Estructura de la Firma de ejemplo • Signature • SignedInfo • CanonicalizationMethod • SignatureMethod • El método de firma también se firma • Reference • Transforms • DigestMethod • DigestValue • SignatureValue

  24. 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

  25. 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

  26. Estadios Firma Canonicalization Transforms DigestMethod SignedInfo DigestValue Verificación DigestValue DigestMethod. SignedInfo SignatureValue KeyInfo

  27. 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

  28. 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

  29. 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; }

  30. 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

  31. 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)); }

  32. 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

  33. 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); }

  34. 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

More Related