La familia SHA (Secure Hash Algorithm, Algoritmo de Hash Seguro) es un sistema
de funciones hash criptográficas relacionadas de la Agencia
de Seguridad
Nacional de los Estados Unidos y publicadas por el National
Institute of Standards and Technology (NIST). El primer miembro de la
familia fue publicado en 1993 es oficialmente llamado SHA. Sin embargo, hoy día, no
oficialmente se le llama SHA-0 para evitar confusiones con
sus sucesores. Dos años más tarde el primer sucesor de SHA fue publicado con el
nombre de SHA-1.
Existen cuatro variantes más que se han publicado desde entonces cuyas
diferencias se basan en un diseño algo modificado y rangos de salida
incrementados: SHA-224, SHA-256, SHA-384, y SHA-512 (todos ellos son referidos como SHA-2).
Existen cuatro variantes más que se han publicado desde entonces cuyas
diferencias se basan en un diseño algo modificado y rangos de salida
incrementados: SHA-224, SHA-256, SHA-384, y SHA-512 (todos ellos son referidos como SHA-2).
En 1998,
un ataque a SHA-0 fue encontrado pero no fue reconocido para SHA-1, se
desconoce si fue la NSA quien lo descubrió pero aumentó la seguridad
del SHA-1.SHA-1 ha sido examinado muy de cerca por la comunidad
criptográfica pública, y no se ha encontrado ningún ataque efectivo. No
obstante, en el año 2004, un número de ataques significativos fueron divulgados sobre funciones criptográficas de hash con una estructura similar a SHA-1; esto ha planteado dudas sobre la seguridad a largo plazo de SHA-1.
SHA-0 y SHA-1 producen una salida resumen de 160 bits de un mensaje que puede tener un tamaño máximo de 264 bits, y se basa en principios similares a los usados por el profesor Ronald L. Rivest del MIT en el diseño de los a
lgoritmos
de resumen del mensajeMD4 y MD5.
AUNQUE!!:
Hace
unos años investigadores chinos habían
logrado reducir la
complejidad del algoritmo SHA-1 a 2^69, es decir, habían logrado reducir su
complejidad en 2^11 en relación con el ataque de cumpleaños de 2^80, dicho de
otro modo, Shandong, Wang, Yin y Yu, durante la "Cripto Conference"
de 2004, demostraron que habían debilitado el SHA-1 en un factor de 2048, lo
que no es poco.
Ahora, según he podido leer en un boletín de Hispasec, unos
investigadores australianoshan
logrado reducir su
complejidad a 2^52, lo que es un logro impresionante, puesto que por cada
unidad en la que se reduce el exponente, se reduce la fortaleza del algoritmo
en un 50%. Dicho de otro modo, a fecha de hoy podemos decir que el algoritmo
SHA-1 se ha debilitado en más de un 99% en relación con su fortaleza inicial
derivada del ataque de cumpleaños, lo que es muy significativo, aunque nos
parezca que 2^52 es una cifra suficientemente grande...
Si ya en el 2004/2005 se aconsejaba
abandonar el SHA-1, con este nuevo avance logrado por los australianos, su
sustitución por otros algoritmos más resistentes se hace indispensable. Una
posible solución, hasta que
se publique el SHA-3, es decir, el algoritmo que está llamado a
sustituirlo, sería usar dos algoritmos consecutivos, por ejemplo SHA-1 Y
RIPEMD-160, puesto que una colisión en SHA-1 es virtualmente imposible que
coincida también en RIPEMD-160. Esta solución de la firma múltiple tiene como ventajas
que usa algoritmos disponibles en sistemas criptográficos de todo tipo y no
implica un excesiva computación.
Hay que señalar, que los documentos que hayamos firmado
usando SHA-1 y que deban tener vigor en el tiempo, puede que no sean seguros
dentro de unos meses. Como norma general, deberíamos usar algoritmos
criptográficos que estimemos que vayan a ser seguros en un tiempo equivalente a
la esperanza de vida de la persona que los utiliza y un 50% más.
Una caída del estándar SHA-1 también afectaría a la
seguridad de los certificados digitales, puesto que sería factible generar
certificados con el mismo fingerprint que otros, lo que permitiría suplantar la
personalidad de personas, o de páginas web.
Hay que señalar, que el e-DNI se han
establecido mecanismos que permiten construir el "PAHT" de
Certificación (Cadena de Confianza) utilizando SHA-1 o SHA-256, para dar
soporte a aquellos sistemas operativos que no contemplan el uso de SHA-256 como
algoritmo de "hash" o resumen. Desgraciadamente, este mecanismo que
depende del sistema operativo que estamos usando, es transparente al usuario la
mayoría de las veces, siendo complicado saber la forma en la que se establece
el "path" de confianza, sin embargo el e-DNI siempre usa el inseguro
SHA-1 para firmar los documentos, según aparece en la página
web oficialdel mismo.
También hay que tener en cuenta, que las claves de los
e-DNI de los usuarios están firmadas usando SHA-1, lo que puede ser un problema
de seguridad a medio y largo plazo y con independencia de la validez en el
futuro de los documentos que firmemos, o que hayamos firmado anteriormente,
usando el omnipresente algoritmo SHA-1. Sin embargo, las claves raíz y
subordinadas del e-DNI, con una vida de 30 y 15 años respectivamente, están
firmadas usando SHA-1 y SHA-256, por lo que las podemos considerar seguras en
este momento.
Ni que decir que ya he configurado mi GPG para que use la
función SHA-256 en la firma de documentos y correos electrónicos, aunque
también es cierto que en los correos uso siempre firma doble, GPG y de la FNMT,
para que no haya problemas.
Ahora el MD5
Paso
1. Adición de bits
Paso
2. Longitud del mensaje
Paso
3. Inicializar el búfer MD
MD5 es uno de los algoritmos de reducción
criptográficos diseñados por el profesor Ronald
Rivest del MIT (Massachusetts Institute of Technology, Instituto Tecnológico de
Massachusetts). Fue desarrollado en 1991 como reemplazo del algoritmo MD4 después
de que Hans Dobbertin descubriese
su debilidad.
A pesar
de su amplia difusión actual, la sucesión de problemas de seguridad detectados
desde que, en 1996, Hans Dobbertin anunciase una colisión
de hash, plantea una serie de dudas acerca de su uso futuro.
§ Terminologías y notaciones
En este
documento "palabra" es una entidad de 32 bits y un byte es una entidad de 8 bits. Una
secuencia de bytes puede ser interpretada de manera natural como una secuencia
de bits, donde cada grupo consecutivo de ocho bits se interpreta como un byte
con el bit más significativo al principio. Similarmente, una secuencia de bytes
puede ser interpretada como una secuencia de 32 bits (palabra), donde cada
grupo consecutivo de cuatro bytes se interpreta como una palabra en la que el
byte menos significativo está al principio.
El símbolo "+" significa suma de palabras.
X <<< s se interpreta por un desplazamiento a la izquierda 's' posiciones
not(x) se entiende como el complemento de x
§ Descripción del
algoritmo md5
Empezamos
suponiendo que tenemos un mensaje de 'b' bits de entrada, y que nos gustaría
encontrar su resumen. Aquí 'b' es un valor arbitrario entero no negativo, pero
puede ser cero, no tiene por qué ser múltiplo de ocho, y puede ser muy largo.
Imaginemos los bits del mensaje escritos así:
m0 m1 ... m{b-1}
Los
siguientes cinco pasos son efectuados para calcular el resumen del mensaje.
Paso
1. Adición de bits
El
mensaje será extendido hasta que su longitud en bits sea congruente con
448, módulo 512. Esto es, si se le resta 448 a la longitud del mensaje tras
este paso, se obtiene un múltiplo de 512. Esta extensión se realiza siempre,
incluso si la longitud del mensaje es ya congruente con 448, módulo 512.
La
extensión se realiza como sigue: un solo bit "1" se añade al mensaje,
y después se añaden bits "0" hasta que la longitud en bits del
mensaje extendido se haga congruente con 448, módulo 512. En todos los mensajes
se añade al menos un bit y como máximo 512.
Paso
2. Longitud del mensaje
Un
entero de 64 bits que represente la longitud 'b' del mensaje (longitud antes de
añadir los bits) se concatena al resultado del paso anterior. En el supuesto no
deseado de que 'b' sea mayor que 2^64, entonces sólo los 64 bits de menor peso
de 'b' se usarán.
En este
punto el mensaje resultante (después de rellenar con los bits y con 'b') se
tiene una longitud que es un múltiplo exacto de 512 bits. A su vez, la longitud
del mensaje es múltiplo de 16 palabras (32 bits por palabra). Con M[0 ... N-1]
denotaremos las palabras del mensaje resultante, donde N es múltiplo de 16.
Paso
3. Inicializar el búfer MD
Un búfer
de cuatro palabras (A, B, C, D) se usa para calcular el resumen del mensaje.
Aquí cada una de las letras A, B, C, D representa un registro de 32 bits. Estos
registros se inicializan con los siguientes valores hexadecimales, los bits de
menor peso primero:
palabra A: 01 23 45 67
palabra B: 89 ab cd ef
palabra C: fe dc ba 98
palabra D: 76 54 32 10
fuente: