Estas aquiContenido / Picadillo digital
Picadillo digital

Por Manuel Lucena
Hace unos meses saltó la liebre. El rumor se propagó rápidamente por foros y listas de correo. SHA-1, junto con otras funciones "hash" criptográficas había sido roto, al menos parcialmente. Como muchos de ustedes sabrán, las funciones "hash" forman el corazón de la práctica totalidad de los esquemas de firma digital usados por el gran público. La gran pregunta estaba servida, ¿en qué medida afectará este descubrimiento a los usuarios de a pie? A la vista de la escasa repercusión posterior del asunto, parece que poco. Sin embargo, parece sensato analizar la cuestión con algo de rigor, e ir considerando posibles sustitutos para un futuro quizás no muy lejano...
Las funciones "hash" (la palabra "hash" viene a significar en inglés algo así como "picadillo", así que permítanme llamarlas a partir de ahora "funciones resumen") permiten obtener, a partir de un mensaje cualquiera, una secuencia de bits de longitud fija (habitualmente entre 128 y 256), que hace el papel de "huella digital" (o signatura) del mensaje, en el sentido de que, dado el valor de la función resumen de un mensaje, resulta muy difícil encontrar otro mensaje distinto que dé lugar al mismo valor que el primero. Estas funciones, combinadas con algoritmos de cifrado asimétricos, permiten firmar digitalmente cualquier trozo de información.
Puesto que el conjunto de posibles mensajes de longitud arbitraria es infinito, el conjunto de posibles secuencias de bits de una longitud determinada es finito, y la función resumen siempre asocia una signatura a cualquier mensaje, deberá existir al menos un valor de signatura que corresponda a infinitos posibles mensajes, aunque, en general, todos los posibles valores de la signatura tendrán esta propiedad. Si llamamos colisión a una pareja de mensajes que dan lugar a la misma signatura, podemos deducir que todas las funciones resumen tienen (infinitas) colisiones, por definición.
Lo que es realmente malo no es que las colisiones se den o no, sino que sea fácil encontrarlas. No obstante, existen diferentes grados de compromiso de una función resumen, en función del tipo de colisiones que se encuentren. Los comentaremos de menor a mayor gravedad:
- Alguien encuentra dos mensajes que tienen la misma signatura, pero no tiene un método sistemático para encontrar más. Esta situación es difícilmente explotable, a no ser que el mensaje que queremos falsificar sea exactamente uno de los que tienen la colisión.
- Mediante un algoritmo, se pueden generar dos mensajes tales que sus signaturas coincidan, si bien se desconoce a priori qué valor van a tener. Usualmente, los mensajes obtenidos carecerán de sentido, por lo que el compromiso, aun siendo mportante, no será demasiado grave.
- Dado un mensaje, se puede calcular otro con la misma signatura. Esta situación es bastante más delicada, ya que podremos sustituir un mensaje determinado por otro que, aunque no tenga sentido, pase por auténtico. Esto podría usarse para, por ejemplo, intoxicar las redes p2p que usen funciones resumen para validar los archivos que se descargan, sustituyendo los mismos por basura. También podría servir para negar la autoría sobre una firma digital, alegando que lo que realmente se firmó fue el mensaje falso.
- Dado un mensaje, se puede calcular otro con la misma signatura, y con una estructura determinada. El término estructura hace aquí alusión a la posibilidad de forzar que el mensaje falso tenga algún sentido, cosa que podríamos lograr buscando a partir de manipulaciones del original que no alteren su significado. Pensemos, por ejemplo, en un archivo html en el que añadimos o quitamos espacios, tabuladores o retornos de carro superfluos.
Una vez disipados los rumores y el revuelo inicial, parece que la verdadera noticia era, en realidad, un ataque del segundo tipo sobre los algoritmos SHA-0, MD4, MD5, HAVAL-128 y RIPEMD, y que SHA-1 permanece a salvo por ahora. Para los que no lo sepan, la NSA (Agencia Nacional de Seguridad de los EE.UU.) desarrolló inicialmente el algoritmo SHA, y al poco tiempo le introdujo una modificación para protegerlo de un posible ataque sobre el que no se dieron detalles, dando lugar así a SHA-1 (y pasando el algoritmo original a llamarse SHA-0). Teniendo en cuenta que SHA-0 data de 1993, y SHA-1 de 1995, no parece tan descabellado pensar que todavía quedan aspectos en los que los criptólogos militares llevan diez años de adelanto a los criptólogos civiles.
Manuel Lucena
aunque mis conocimientos en el tema de las firmas digitales no es demasiado amplia, creo que es bastante improbabel que un particular o un grupo formado por particulares, consiga quebrar SHA-1. El equipo y los costes del proceso son totalmente inasequibles para un usuario particular, con lo cual, cuando SHA-1 se pueda romper por un usuario civil, los criptólogos militares haran avanzado, habiendo creado un "SHA-2" o algun otro mecanismo, por lo tanto, me sigo fiando de la seguridad de este algoritmo.
Las interceptaciones civiles no son las únicas que deben preocuparte ;)
Existe un parche ya que no una solución que me parece que ya usan ciertas redes P2P como la de Emule. Se trata de usar varios Hash para un mismo archivo (digamos, por ejemplo, SHA-1 y Haval 128). Si un archivo va doblemente identificado sí que resulta realmente difícil colar un archivo falso (a ver quien es el que diseña un algoritmo que dado un archivo con dos Hash diferentes crea otro con esos mismos hashes).
__
Me interesa el futuro porque es el sitio donde voy a pasar el resto de mi vida.
- Woody Allen
Me interesa el futuro porque es el sitio donde voy a pasar el resto de mi vida.
- Woody Allen
Una de las reglas de la criptografía es "nunca cifres lo mismo dos veces con distintas claves", aunque no sé si aquí es aplicable...
No estoy de acuerdo con lo que dices, pero defenderé con mi vida tu derecho a decirlo.
- Voltaire -
No estoy de acuerdo con lo que dices, pero defendería con mi vida tu derecho a decirlo.
- Voltaire -
Este es uno de los errores mas comunes cuando se habla de funciones resumen. Creo que Manuel Lucena lo explica bien claro. Un hash no es un algoritmo de cifrado, ni siquiera hay claves.
Una pequeña aportación.
En ocasiones las funciones resumen se usan para aumentar artificialmente las longitudes de claves simétricas de los usuarios, por ejemplo, si un usuario a creado una clave de 4 caracteres "pepe", y tiene que utilizarse para autenticación ante un servidor o programa, se sustituye por su hash: 265392DC2782778664CC9D56C8E3CD9956661BB0 (SHA 160 bits). Esto evita un ataque por fuerza bruta que sería muy sencillo para la clave "pepe". El servidor o programa destino genera a su vez el hash SHA de "pepe" y lo compara con el hash mandado por el usuario. Si son iguales, quiere decir que ambos han generado los hash a partir del mismo original, la clave, y da por buena la autenticación.
Vamos a ver como podríamos encontrar claves a partir de hash:
Nos podemos crear una pequeña rutina que genere hash (SHA o MD5 por ejemplo) de claves que vamos generando por orden alfabético (por ejemplo) y que guarde en bbdd las parejas Hash-Clave. Transcurrido un tiempo tendremos una bbdd con los hash de todas las claves de longitud 6, 7, 8, 9,... etc dependiendo de nuestra paciencia. Si ordenamos esta tabla por hash y la guardamos en 1,2, etc DVD's podremos consultar a que original pertenece un hash en cuestión de segundos siempre que queramos.
Pero claro, podríamos usar los hash generados anteriormente para hacer el ataque por fuerza bruta, por lo que no habríamos aumentado mucho la seguridad, ya que habría el mismo numero de hash que de claves con longitud 4. Sin embargo se puede aumentar la clave mediante un valor conocido por ambos, por ejemplo, a "pepe" le podemos agregar el valor de la ID de sesión, la fecha, el login, el propio hash de "pepe", etc, para aumentar la longitud de la clave a "pepe28/1/2005" con hash 09BA88ADFC9D56679A6A2FBAB8867047979EB42E (SHA 160 bits), evitando así la identificación del original por el método anterior (13 caracteres ya serían muchos DVD,s).
La verdad, es que son las unicas que de verdad me preocupan.
Saludos
Necesito saber si alguien conoce el algoritmo que usa SHA1 para generar las firmas (huellas) digitales de algun documento.
http://en.wikipedia.org/wiki/SHA_hash_functions
Tiempo invertido en la búsqueda: 5 segundos.
Saludos nuevamente
Me disculpo por no hacerme entender, en realidad quiero saber si alguien conoce algúna función (código de programa) en ASP con la cual le pueda enviar la data a firmar, la llave privada y signature y me genere una firma (huella) digital para un documento.
Se les agradece su apoyo.