Seguridad (para Seguridad (para desarrolladores)desarrolladores)
Firma digital XMLFirma digital XML
Mauricio GrimbergMauricio [email protected]@mug.org.arAxtonAxtonhttp://www.axton.com.ar/http://www.axton.com.ar/
¿Qué pretendemos ¿Qué pretendemos asegurar?asegurar?
Que quien “firma” el documento sea quien Que quien “firma” el documento sea quien dice ser dice ser
Equivalente exacto a una firma manualEquivalente exacto a una firma manual
Que el contenido que tenemos enfrente es Que el contenido que tenemos enfrente es el que el firmante firmó (perdón por el el que el firmante firmó (perdón por el trabalenguas)trabalenguas)
Verificación de que no hubo transformación Verificación de que no hubo transformación posterior a la firmaposterior a la firma
NoNo vamos a tocar en esta charla el tema vamos a tocar en esta charla el tema encriptación encriptación general del contenido; general del contenido; lateralmente enfocaremos el tema lateralmente enfocaremos el tema encriptación en el marco de la operatoria encriptación en el marco de la operatoria de la firma.de la firma.
En términos más técnicos En términos más técnicos pero no menos generalespero no menos generales
Generaremos un nodo XML que Generaremos un nodo XML que contienecontiene
Un resumen de todo lo que se quiere Un resumen de todo lo que se quiere firmarfirmar
La indicación de cómo se preprocesa el La indicación de cómo se preprocesa el material a firmarmaterial a firmar
La indicación de cómo se resume lo La indicación de cómo se resume lo preprocesadopreprocesado
Una encriptación del resumen utilizando Una encriptación del resumen utilizando claves asimétricasclaves asimétricas
Algo asíAlgo así
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><SignedInfo>
<!--La información firmada--><!--La información firmada--><CanonicalizationMethod <CanonicalizationMethod
Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><SignatureMethod <SignatureMethod
Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/><Reference URI=""><Reference URI="">
<Transforms><Transforms> <!--Remueve del cálculo del compendio toda la estructura generada a partir de <!--Remueve del cálculo del compendio toda la estructura generada a partir de
[Signature] -->[Signature] --><Transform <Transform
Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/></Transforms></Transforms><DigestMethod <DigestMethod
Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><DigestValue>2PCZb3vt8JaSdzzVZyenRoFU694=</<DigestValue>2PCZb3vt8JaSdzzVZyenRoFU694=</
DigestValue>DigestValue></Reference></Reference>
</SignedInfo></SignedInfo>
<SignatureValue>Afc+biLiXr5XGLHC1Iz5+Jnz4UaQzSx9seOj5ac+l+a7FlXAonZMaUd3f<SignatureValue>Afc+biLiXr5XGLHC1Iz5+Jnz4UaQzSx9seOj5ac+l+a7FlXAonZMaUd3f6pZ0zG46WdcXqoNq1Rl2noGTE2+uSjP8CSYeFdRFZMiIiq03u0xPx5eg5tU9iucRmH3NY6pZ0zG46WdcXqoNq1Rl2noGTE2+uSjP8CSYeFdRFZMiIiq03u0xPx5eg5tU9iucRmH3NYmLEMDSbGnS2AYDc24lPsHRf2BtXbd/g9bufAh5CRrdLYc=</SignatureValue>mLEMDSbGnS2AYDc24lPsHRf2BtXbd/g9bufAh5CRrdLYc=</SignatureValue></Signature></Signature>
Clave simétricaClave simétrica
Es una clave únicaEs una clave única
Se denomina simétrica porque la Se denomina simétrica porque la misma clave debe estar disponible misma clave debe estar disponible para quien firma y para quien verifica para quien firma y para quien verifica la firmala firma
Implica una necesidad importante de Implica una necesidad importante de transportación de la clavetransportación de la clave
Esto desvaloriza el sistema: la clave está Esto desvaloriza el sistema: la clave está viajando todo el tiempoviajando todo el tiempo
Claves asimétricasClaves asimétricas
Clave Clave públicapúblicaClave Clave privadaprivadaTienen un funcionamiento Tienen un funcionamiento complementario que permite complementario que permite utilizarlas de un modo utilizarlas de un modo asimétricoasimétrico: : firmo con la privada y verifico con la firmo con la privada y verifico con la públicapúblicaLa pública es PÚBLICA: la puedo La pública es PÚBLICA: la puedo distribuir a mi gustodistribuir a mi gustoRápidamente: si puedo verificar una Rápidamente: si puedo verificar una firma usando una clave pública es firma usando una clave pública es porque quien la firmó tiene la clave porque quien la firmó tiene la clave privadaprivada
Claves e identidadClaves e identidad
De nada sirve una clave no asociada De nada sirve una clave no asociada a una determinada itentidada una determinada itentidad
En En TODOTODO caso “alguien” debe caso “alguien” debe certificar – del mismo modo que un certificar – del mismo modo que un Banco certifica nuestra firma manual Banco certifica nuestra firma manual - la asociación entre - la asociación entre ClaveClave e e IdentidadIdentidad
Verificación de identidadVerificación de identidad
Por certificadoPor certificadoObtenemos un certificado generado por Obtenemos un certificado generado por una entidad una entidad autorizadaautorizada para asegurar para asegurar que puede proveer un certificado que puede proveer un certificado únicoúnico a a una persona o empresa una persona o empresa verificableverificableEs la manera Es la manera estándarestándar
Por clavePor claveGeneramos claves programáticamente y Generamos claves programáticamente y las almacenamos en una base de datos, las almacenamos en una base de datos, la aplicación certifica el vínculo entre la aplicación certifica el vínculo entre clave e identidadclave e identidadValidez sólo internaValidez sólo interna
¿Qué es un certificado?¿Qué es un certificado?
Es un contenedor único - especificado Es un contenedor único - especificado de un modo estándar - de claves, de un modo estándar - de claves, información del sujeto, de la entidad información del sujeto, de la entidad autorizante y de los procedimientos autorizante y de los procedimientos asociadosasociados
Definido por el grupo de trabajo Definido por el grupo de trabajo Internet Internet Engineering Task Force (IETF) Public Key Engineering Task Force (IETF) Public Key Infrastructure, X.509 (PKIX)Infrastructure, X.509 (PKIX)
Es - finalmente - un mensaje en el que Es - finalmente - un mensaje en el que el el autorizanteautorizante asegura la identidad del asegura la identidad del titulartitular
CA (certificate authority)CA (certificate authority)
Modelo de confianza “absoluta”Modelo de confianza “absoluta”
Los proveedores de certificados (los Los proveedores de certificados (los CA) son quienes se responsabilizan CA) son quienes se responsabilizan por la identificación e integridad del por la identificación e integridad del certificado “hacia todos”, en todo certificado “hacia todos”, en todo contextocontexto
No repudiableNo repudiable
El hecho de la certificación universal El hecho de la certificación universal producida por un certificado produce producida por un certificado produce el tercer valor de la firma digitalel tercer valor de la firma digital
IntegridadIntegridad
IdentificaciónIdentificación
No repudiabilidadNo repudiabilidad
X.509X.509
Es una colección de Es una colección de especificaciones especificaciones para estandarizar la para estandarizar la metodología de metodología de clave públicaclave pública
Contiene ambas Contiene ambas claves (o sólo la claves (o sólo la pública) y más pública) y más información información destinada a procesos destinada a procesos de identificación de de identificación de entidades y entidades y algoritmos bajo la algoritmos bajo la forma de un forma de un certificadocertificado
X.509X.509
Version Version Versión de X.509Versión de X.509
Serial Number Serial Number Según RFC 2459 es un número entero Según RFC 2459 es un número entero que identifica absolutamente a un que identifica absolutamente a un certificado en el contexto de un certificado en el contexto de un determinado CAdeterminado CA
Algorithm ID Algorithm ID Algoritmo de encriptación utilizadoAlgoritmo de encriptación utilizado
Issuer Issuer Emisor del certificadoEmisor del certificado
X.509X.509
Not Before Not Before Inicio de validez (fecha)Inicio de validez (fecha)
Not After Not After Fin de validez (fecha)Fin de validez (fecha)
Subject Subject Nombre distinguible del sujetoNombre distinguible del sujeto
Public Key Info Public Key Info Información de claveInformación de clave
Generación de certificadosGeneración de certificados
A los fines del desarrollo A los fines del desarrollo generaremos uno utilizando generaremos uno utilizando MakecertMakecert
Luego lo podremos examinar Luego lo podremos examinar utilizando MMC (Microsoft utilizando MMC (Microsoft Management Console) mediante el Management Console) mediante el snap-in snap-in CertificatesCertificates
MakecertMakecert
.Net Framework SDK 2.0 contiene la .Net Framework SDK 2.0 contiene la última versiónúltima versión
Generamos un certificado que incluye Generamos un certificado que incluye una clave privada, denominación del una clave privada, denominación del titular, fechas de vigencia y lo titular, fechas de vigencia y lo enviamos al almacenamiento enviamos al almacenamiento personalpersonal
makecert -r -pe -n makecert -r -pe -n "CN=XML_DIG_SIGN_Mauricio" -b "CN=XML_DIG_SIGN_Mauricio" -b 11/28/2005 -e 11/28/2010 -sky exchange 11/28/2005 -e 11/28/2010 -sky exchange -ss my-ss my
SHA1SHA1
Secure Hash Algorithm - Version 1.0 Secure Hash Algorithm - Version 1.0
http://www.w3.org/PICS/DSig/SHA1_1http://www.w3.org/PICS/DSig/SHA1_1_0.html_0.html
Algoritmo diseñado para ser usado Algoritmo diseñado para ser usado con firma digital - Digital Signature con firma digital - Digital Signature Standard (DSS) – con el objetivo de Standard (DSS) – con el objetivo de generar un resumen del contenido a generar un resumen del contenido a firmarfirmar
RSARSA
Es un algoritmo de encriptación Es un algoritmo de encriptación asimétricaasimétrica
Generado en 1977 por Ron Generado en 1977 por Ron RRivest, ivest, Adi Adi SShamir y Len hamir y Len AAdleman - las dleman - las iniciales de sus apellidos componen iniciales de sus apellidos componen su nombre - en el MITsu nombre - en el MIT
Junto con Sha1 son preferidos por el Junto con Sha1 son preferidos por el W3C para los usos de XML Digital W3C para los usos de XML Digital Signature Signature
((<SignatureMethod <SignatureMethod Algorithm="http://www.w3.org/2000/09/Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>xmldsig#rsa-sha1"/>))
Firma digitalFirma digital
Detached Detached DesconectadaDesconectada
EnvelopingEnvelopingEnvolvente: la información firmada está Envolvente: la información firmada está embebidaembebida
EnvelopedEnvelopedEnvuelta: el documento contiene la firmaEnvuelta: el documento contiene la firma
Proceso de firmaProceso de firma
Generación de referenciasGeneración de referenciasAplicar las transformacionesAplicar las transformaciones
Calcular los compendiosCalcular los compendios
Agregar los respectivos elementos Agregar los respectivos elementos ReferenceReference
Generación de la firmaGeneración de la firmaConstruir SignedInfoConstruir SignedInfo
Construir SignatureValueConstruir SignatureValue
Construir el nodo principal y, Construir el nodo principal y, eventualmente, agregar información eventualmente, agregar información de claves públicas o certificadosde claves públicas o certificados
Proceso de validación de Proceso de validación de firmafirma
Construir el resumen utilizando el Construir el resumen utilizando el algoritmo especificadoalgoritmo especificado
Si coincide continuamosSi coincide continuamos
Obtenemos la información de clavesObtenemos la información de claves
Utilizamos el algoritmo de Utilizamos el algoritmo de encriptación asimétrica para validar encriptación asimétrica para validar la firmala firma
CanonicalizationCanonicalization
Los algoritmos de criptografía Los algoritmos de criptografía esperan textos exactos esperan textos exactos (inmodificados) como condición de (inmodificados) como condición de igualdadigualdad
XML tiene flexibilidades en la XML tiene flexibilidades en la condición de igualdad:condición de igualdad:
Espacios en blancoEspacios en blanco
Orden de los atributosOrden de los atributos
Estructura de la Firma de Estructura de la Firma de ejemploejemplo
SignatureSignatureSignedInfoSignedInfo
CanonicalizationMethodCanonicalizationMethod
SignatureMethodSignatureMethodEl método de firma también se firmaEl método de firma también se firma
ReferenceReferenceTransformsTransforms
DigestMethodDigestMethod
DigestValueDigestValue
SignatureValueSignatureValue
ElementosElementos
SignatureRaíz de la firmaRaíz de la firma
SignedInfoLa información efectivamente firmadaLa información efectivamente firmada
TransformsPasos de transformación: XPATH, XSL, Pasos de transformación: XPATH, XSL, etc.etc.
CanonicalizationMethodEl algoritmo usado para El algoritmo usado para canonicalizarcanonicalizar
Elementos 2Elementos 2
ReferenceCada recurso del documento a ser firmadoPuede incluir múltiples transformacionesPuede incluir múltiples transformaciones
DigestMethodEl algoritmo utilizado para producir el DigestValue
SignatureValueEl resultado de aplicar la clave al DigestValue utilizando el agoritmo del SignatureMethod
KeyInfoInformación (opcional) sobre la clave
EstadiosEstadios
CanonicalizationCanonicalization TransformsTransforms DigestMethodDigestMethodSignedInfoSignedInfo DigestValueDigestValue
DigestValueDigestValue
SignedInfoSignedInfo SignatureValueSignatureValue
DigestMethod.DigestMethod.
KeyInfoKeyInfo
FirmaFirma
VerificacióVerificaciónn
MultiplicidadMultiplicidad
Múltiples transformacionesMúltiples transformacionesDetalladas en cada elemento TransformDetalladas en cada elemento Transform
Múltiples referenciasMúltiples referenciasPuede utilizarse un manifiesto (colección Puede utilizarse un manifiesto (colección de referencias) en caso de que sean de referencias) en caso de que sean muchasmuchas
Obtener el certificado (VB)Obtener el certificado (VB)
Public Function ObtenerCertificado(ByVal subject As String) As Public Function ObtenerCertificado(ByVal subject As String) As X509Certificate2X509Certificate2
Dim store As New X509Store(StoreLocation.CurrentUser)Dim store As New X509Store(StoreLocation.CurrentUser) store.Open(OpenFlags.ReadOnly)store.Open(OpenFlags.ReadOnly) Dim certCollection As X509Certificate2Collection = Dim certCollection As X509Certificate2Collection =
store.Certificatesstore.Certificates Dim cert As X509Certificate2 = NothingDim cert As X509Certificate2 = Nothing
Dim c As X509Certificate2Dim c As X509Certificate2 For Each c In certCollectionFor Each c In certCollection If c.Subject = subject ThenIf c.Subject = subject Then Return cReturn c End IfEnd If Next cNext c Return NothingReturn Nothing End FunctionEnd Function
Obtener el certificado Obtener el certificado (C#)(C#) public static X509Certificate2 ObtenerCertificado(String public static X509Certificate2 ObtenerCertificado(String
subject)subject) {{ X509Store store = new X509Store store = new
X509Store(StoreLocation.CurrentUser);X509Store(StoreLocation.CurrentUser); store.Open(OpenFlags.ReadOnly);store.Open(OpenFlags.ReadOnly); X509Certificate2Collection certCollection = X509Certificate2Collection certCollection =
store.Certificates;store.Certificates; foreach (X509Certificate2 c in certCollection)foreach (X509Certificate2 c in certCollection) {{ if (c.Subject == subject)if (c.Subject == subject) {{ return c;return c; }}
}} return null;return null; }}
Firmar digitalmente (VB)Firmar digitalmente (VB)
Public Sub FirmarXML(Public Sub FirmarXML(ByRefByRef documento As documento As XmlDocument, ByVal certificado As XmlDocument, ByVal certificado As X509Certificate2)X509Certificate2)
Dim sig As SignedXml = New Dim sig As SignedXml = New SignedXml(documento)SignedXml(documento)
sig.SigningKey = certificado.PrivateKeysig.SigningKey = certificado.PrivateKey Dim reference As New Reference()Dim reference As New Reference() reference.Uri = ""reference.Uri = "" Dim env As New Dim env As New
XmlDsigEnvelopedSignatureTransform()XmlDsigEnvelopedSignatureTransform() reference.AddTransform(env)reference.AddTransform(env) sig.AddReference(reference)sig.AddReference(reference) sig.ComputeSignature()sig.ComputeSignature() Dim xmlDigitalSignature As XmlElement = Dim xmlDigitalSignature As XmlElement =
sig.GetXml()sig.GetXml()
documento.DocumentElement.AppendChild(docudocumento.DocumentElement.AppendChild(documento.ImportNode(xmlDigitalSignature, True))mento.ImportNode(xmlDigitalSignature, True))
End SubEnd Sub
Firmar digitalmente (C#)Firmar digitalmente (C#)
public static void FirmarXML(ref XmlDocument documento, public static void FirmarXML(ref XmlDocument documento, X509Certificate2 certificado)X509Certificate2 certificado)
{{ SignedXml sig = new SignedXml(documento);SignedXml sig = new SignedXml(documento); sig.SigningKey = certificado.PrivateKey;sig.SigningKey = certificado.PrivateKey; Reference reference = new Reference();Reference reference = new Reference(); reference.Uri = "";reference.Uri = ""; XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform env = new
XmlDsigEnvelopedSignatureTransform();XmlDsigEnvelopedSignatureTransform(); reference.AddTransform(env);reference.AddTransform(env); sig.AddReference(reference);sig.AddReference(reference); sig.ComputeSignature();sig.ComputeSignature(); XmlElement xmlDigitalSignature = sig.GetXml();XmlElement xmlDigitalSignature = sig.GetXml();
documento.DocumentElement.AppendChild(documento.Impdocumento.DocumentElement.AppendChild(documento.ImportNode(xmlDigitalSignature, true));ortNode(xmlDigitalSignature, true));
}}
Verificar Firma (VB)Verificar Firma (VB)
Public Function VerificarFirma(ByVal Public Function VerificarFirma(ByVal documento As XmlDocument, ByVal documento As XmlDocument, ByVal certificado As X509Certificate2) As Booleancertificado As X509Certificate2) As Boolean
Dim sig As SignedXml = New Dim sig As SignedXml = New SignedXml(documento)SignedXml(documento)
Dim nodeList As XmlNodeList = Dim nodeList As XmlNodeList = documento.GetElementsByTagName("Signdocumento.GetElementsByTagName("Signature")ature")
sig.LoadXml(CType(nodeList(0), sig.LoadXml(CType(nodeList(0), XmlElement))XmlElement))
Return sig.CheckSignature(certificado, Return sig.CheckSignature(certificado, True)True)
End FunctionEnd Function
Verificar Firma (C#)Verificar Firma (C#)
static Boolean static Boolean VerificarFirma(XmlDocument documento, VerificarFirma(XmlDocument documento, X509Certificate2 certificado)X509Certificate2 certificado)
{{
SignedXml sig = new SignedXml sig = new SignedXml(documento);SignedXml(documento);
XmlNodeList nodeList = XmlNodeList nodeList = documento.GetElementsByTagName("Signdocumento.GetElementsByTagName("Signature");ature");
sig.LoadXml((XmlElement)nodeList[0]);sig.LoadXml((XmlElement)nodeList[0]);
return sig.CheckSignature(certificado, return sig.CheckSignature(certificado, true);true);
}}
VínculosVínculos
http://world.std.com/~franl/crypto/rsahttp://world.std.com/~franl/crypto/rsa-example.html-example.htmlhttp://www.codeproject.com/dotnet/xhttp://www.codeproject.com/dotnet/xmldsiglic.aspmldsiglic.asphttp://msdn.microsoft.com/library/defhttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwebsrv/ault.asp?url=/library/en-us/dnwebsrv/html/underxmldigsig.asphtml/underxmldigsig.asphttp://www.jensign.com/http://www.jensign.com/ EL VÍNCULO: EL VÍNCULO: http://www.w3.org/TR/2002/REC-xmldhttp://www.w3.org/TR/2002/REC-xmldsig-core-20020212/Overview.htmlsig-core-20020212/Overview.html