Seguridad para desarrolladores Firma digital XML Mauricio Grimberg
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. w 3. org/2000/09/xmldsig#"> <Signed. Info> <!--La información firmada--> <Canonicalization. Method Algorithm="http: //www. w 3. org/TR/2001/REC-xml-c 14 n 20010315"/> <Signature. Method Algorithm="http: //www. w 3. org/2000/09/xmldsig#rsa-sha 1"/> <Reference URI=""> <Transforms> <!--Remueve del cálculo del compendio toda la estructura generada a partir de [Signature] --> <Transform Algorithm="http: //www. w 3. org/2000/09/xmldsig#enveloped-signature"/> </Transforms> <Digest. Method Algorithm="http: //www. w 3. org/2000/09/xmldsig#sha 1"/> <Digest. Value>2 PCZb 3 vt 8 Ja. Sdzz. VZyen. Ro. FU 694=</Digest. Value> </Reference> </Signed. Info> <Signature. Value>Afc+bi. Li. Xr 5 XGLHC 1 Iz 5+Jnz 4 Ua. Qz. Sx 9 se. Oj 5 ac+l+a 7 Fl. XAon. ZMa. Ud 3 f 6 p. Z 0 z. G 46 Wdc. Xqo. Nq 1 Rl 2 no. GTE 2+u. Sj. P 8 CSYe. Fd. RFZMi. Iiq 03 u 0 x. Px 5 eg 5 t. U 9 iuc. Rm. H 3 NYm. LEMDSb. Gn. S 2 AYDc 24 l Ps. HRf 2 Bt. Xbd/g 9 buf. Ah 5 CRrd. LYc=</Signature. Value> </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 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
SHA 1 Secure Hash Algorithm - Version 1. 0 http: //www. w 3. org/PICS/DSig/SHA 1_1_0. h tml 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 Sha 1 son preferidos por el W 3 C para los usos de XML Digital Signature (<Signature. Method Algorithm="http: //www. w 3. org/2000/09/xmld sig#rsa-sha 1"/>)
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 Signed. Info Construir Signature. Value 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 Signed. Info Canonicalization. Method Signature. Method El método de firma también se firma Reference Transforms Digest. Method Digest. Value Signature. Value
Elementos Signature Raíz de la firma Signed. Info La información efectivamente firmada Transforms Pasos de transformación: XPATH, XSL, etc. Canonicalization. Method El algoritmo usado para canonicalizar
Elementos 2 Reference Cada recurso del documento a ser firmado Puede incluir múltiples transformaciones Digest. Method El algoritmo utilizado para producir el Digest. Value Signature. Value El resultado de aplicar la clave al Digest. Value utilizando el agoritmo del Signature. Method Key. Información (opcional) sobre la clave
Estadios Firma Signed. Info Canonicalization Transforms Verificación Digest. Method. Key. Info Digest. Value Signed. Info Signature. Value Digest. Method Digest. Value
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 Obtener. Certificado(By. Val subject As String) As X 509 Certificate 2 Dim store As New X 509 Store(Store. Location. Current. User) store. Open(Open. Flags. Read. Only) Dim cert. Collection As X 509 Certificate 2 Collection = store. Certificates Dim cert As X 509 Certificate 2 = Nothing Dim c As X 509 Certificate 2 For Each c In cert. Collection If c. Subject = subject Then Return c End If Next c Return Nothing End Function
Obtener el certificado (C#) public static X 509 Certificate 2 Obtener. Certificado(String subject) { X 509 Store store = new X 509 Store(Store. Location. Current. User); store. Open(Open. Flags. Read. Only); X 509 Certificate 2 Collection cert. Collection = store. Certificates; foreach (X 509 Certificate 2 c in cert. Collection) { if (c. Subject == subject) { return c; } } return null; }
Firmar digitalmente (VB) Public Sub Firmar. XML(By. Ref documento As Xml. Document, By. Val certificado As X 509 Certificate 2) Dim sig As Signed. Xml = New Signed. Xml(documento) sig. Signing. Key = certificado. Private. Key Dim reference As New Reference() reference. Uri = "" Dim env As New Xml. Dsig. Enveloped. Signature. Transform() reference. Add. Transform(env) sig. Add. Reference(reference) sig. Compute. Signature() Dim xml. Digital. Signature As Xml. Element = sig. Get. Xml() documento. Document. Element. Append. Child(documento. I mport. Node(xml. Digital. Signature, True)) End Sub
Firmar digitalmente (C#) public static void Firmar. XML(ref Xml. Document documento, X 509 Certificate 2 certificado) { Signed. Xml sig = new Signed. Xml(documento); sig. Signing. Key = certificado. Private. Key; Reference reference = new Reference(); reference. Uri = ""; Xml. Dsig. Enveloped. Signature. Transform env = new Xml. Dsig. Enveloped. Signature. Transform(); reference. Add. Transform(env); sig. Add. Reference(reference); sig. Compute. Signature(); Xml. Element xml. Digital. Signature = sig. Get. Xml(); documento. Document. Element. Append. Child(documento. Import. Node(x ml. Digital. Signature, true)); }
Verificar Firma (VB) Public Function Verificar. Firma(By. Val documento As Xml. Document, By. Val certificado As X 509 Certificate 2) As Boolean Dim sig As Signed. Xml = New Signed. Xml(documento) Dim node. List As Xml. Node. List = documento. Get. Elements. By. Tag. Name("Signature") sig. Load. Xml(CType(node. List(0), Xml. Element)) Return sig. Check. Signature(certificado, True) End Function
Verificar Firma (C#) static Boolean Verificar. Firma(Xml. Document documento, X 509 Certificate 2 certificado) { Signed. Xml sig = new Signed. Xml(documento); Xml. Node. List node. List = documento. Get. Elements. By. Tag. Name("Signature"); sig. Load. Xml((Xml. Element)node. List[0]); return sig. Check. Signature(certificado, true); }
Vínculos http: //world. std. com/~franl/crypto/rsaexample. html http: //www. codeproject. com/dotnet/xmldsi glic. asp http: //msdn. microsoft. com/library/default. asp? url=/library/enus/dnwebsrv/html/underxmldigsig. asp http: //www. jensign. com/ EL VÍNCULO: http: //www. w 3. org/TR/2002/REC-xmldsigcore-20020212/Overview. html
- Slides: 34