Ir al contenido
Toova
Todas las herramientas

MD5 vs SHA-256 — Por Qué Debes Dejar de Usar MD5

Toova

MD5 está en todas partes. Viene incluido en cada lenguaje de programación, cada base de datos, cada SDK de proveedor de nube. Los desarrolladores lo usan por inercia — es rápido, produce una cadena hexadecimal de 32 caracteres pulcra, y la API tiene dos líneas de código. El problema: MD5 ha estado criptográficamente roto desde 2004, y los ataques solo se han vuelto más rápidos y baratos desde entonces.

Esto no es teórico. Un ciberataque de 2012 contra infraestructura iraní — el malware Flame — falsificó un certificado de firma de código de Microsoft explotando una colisión MD5. La misma técnica que los criptógrafos académicos demostraron en un artículo se convirtió en un arma utilizada en espionaje geopolítico. MD5 no está ligeramente debilitado; está fundamentalmente comprometido para cualquier aplicación donde un adversario pueda elegir las entradas.

SHA-256, parte de la familia SHA-2 estandarizada por NIST, no tiene ataques de colisión conocidos y sigue siendo el estándar de integridad criptográfica en 2026. Este artículo explica exactamente qué significa la diferencia, cuándo (raramente) MD5 es todavía aceptable, y cómo migrar de forma segura. Puedes calcular ambos hashes al instante con las herramientas MD5 hash y SHA-256 hash de Toova.

Cómo Funcionan las Funciones Hash

Una función hash criptográfica toma una entrada de cualquier longitud y produce una salida de longitud fija (el digest) con estas propiedades:

  • Determinista: la misma entrada siempre produce la misma salida.
  • Efecto avalancha: un solo cambio de bit en la entrada cambia completamente la salida.
  • Resistencia a la preimagen: dado un hash, es computacionalmente inviable encontrar la entrada.
  • Resistencia a colisiones: es computacionalmente inviable encontrar dos entradas diferentes que produzcan el mismo hash.

El efecto avalancha es por qué tanto MD5 como SHA-256 se ven similares a primera vista:

MD5("The quick brown fox jumps over the lazy dog")
= 9e107d9d372bb6826bd81d3542a419d6

MD5("The quick brown fox jumps over the lazy cog")
= 1055d3e698d289f2af8663725127bd4b
SHA-256("The quick brown fox jumps over the lazy dog")
= d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592

SHA-256("The quick brown fox jumps over the lazy cog")
= e4c4d8f3bf76b692de791a173e05321150f7a345b46484fe427f6acc7ecc81be

Un carácter cambió en la entrada ("dog" → "cog"), pero la salida es completamente diferente. Esta propiedad se cumple para ambos algoritmos. La diferencia está en lo que ocurre cuando un atacante trata de encontrar una colisión intencionalmente.

MD5 — Una Cronología de Fallos (1996–2025)

MD5 fue diseñado por Ron Rivest en 1991 como sustituto de MD4. En 1996, Hans Dobbertin encontró colisiones en la función de compresión de MD5 — no en el algoritmo completo, pero fue una señal de advertencia de que el diseño era frágil. La comunidad de seguridad comenzó a recomendar la migración a SHA-1. La mayoría de los sistemas ignoraron esto.

2004 — Colisiones completas demostradas

En agosto de 2004, Xiaoyun Wang y Hongbo Yu presentaron un ataque de colisión práctico contra MD5 en la conferencia CRYPTO. Podían generar dos mensajes de 1.024 bits diferentes con el mismo hash MD5 en menos de una hora en un clúster. La garantía fundamental de MD5 — la resistencia a colisiones — estaba rota.

NIST comenzó inmediatamente a deprecar MD5 para uso federal. La mayoría de las guías del sector siguieron el ejemplo. El despliegue real de MD5 en sistemas de producción apenas cambió.

2008 — Certificados CA fraudulentos

Un grupo de investigadores (Sotirov, Stevens, et al.) demostró que podían crear un certificado de Autoridad de Certificación fraudulento que sería de confianza para todos los principales navegadores. El ataque explotaba el hecho de que varias autoridades de certificación todavía firmaban certificados con MD5. Los investigadores generaron una colisión entre una solicitud de certificado de aspecto legítimo y un certificado CA auto-fabricado — luego lograron que una CA real firmara el legítimo, produciendo una firma que también era válida para el CA falsificado.

Todos los principales navegadores bloquearon inmediatamente los certificados firmados con MD5. La mayoría de las autoridades de certificación dejaron de emitirlos. Una lección clave: las debilidades criptográficas se vuelven explotables en el momento en que un atacante controla la entrada a la función hash.

2012 — Malware Flame

El malware de ciberespionaje Flame, descubierto en 2012 y atribuido a actores estatales, falsificó un certificado de Windows Update de Microsoft usando una colisión MD5 de prefijo elegido. El ataque fue más sofisticado que la demostración de 2008: los atacantes podían crear un payload malicioso que colisionaba con un certificado legítimo de Microsoft bajo condiciones en las que la infraestructura de firma de Microsoft cooperaría sin saberlo.

El resultado: Flame podía distribuirse a través de Windows Update como si fuera una actualización legítima de Microsoft, con una firma válida de Microsoft. Cientos de miles de máquinas Windows en Irán, Líbano, Siria y Sudán fueron infectadas. Esta fue una explotación real de los ataques de colisión MD5 a escala de estado-nación. Consulta el artículo de Wikipedia sobre el malware Flame para la historia completa.

2019–2025 — HashClash y colisiones instantáneas

El proyecto HashClash (Marc Stevens, CWI Amsterdam) continuó llevando la generación de colisiones MD5 a límites prácticos. Para 2019, las colisiones MD5 de prefijo elegido — donde un atacante puede elegir prefijos arbitrarios para ambos mensajes en colisión — podían generarse en días en hardware de consumo. Para 2022, las implementaciones optimizadas redujeron esto a horas. En 2024, un artículo de HashClash demostró colisiones en menos de un minuto en una única GPU moderna.

La trayectoria es clara: los ataques de colisión MD5 no se vuelven más difíciles a medida que el hardware mejora — se vuelven más fáciles. Lo que tomaba un clúster en 2004 toma un portátil en 2026.

SHA-256 — Por Qué Se Mantiene Firme

SHA-256 forma parte de la familia SHA-2, diseñada por la NSA y estandarizada por NIST en 2001. Produce un digest de 256 bits (32 bytes). No se conocen ataques de colisión prácticos contra SHA-256 a partir de 2026. Los mejores ataques publicados reducen el factor de trabajo teórico para encontrar colisiones a aproximadamente 2^187 operaciones — todavía muy por encima de cualquier recurso computacional que exista o sea previsible.

El margen de seguridad de SHA-256 es intencionalmente conservador. Incluso si el hardware mejora en un factor de mil millones (aproximadamente 30 duplicaciones en términos de la ley de Moore), romper SHA-256 sigue siendo computacionalmente inviable. El factor de trabajo efectivo de 2^18 a 2^23 para colisiones de MD5 estaba al alcance de hardware modesto en 2004.

SHA-256 también es más rápido de lo que podrías esperar: las CPUs modernas incluyen instrucciones SHA dedicadas (Intel SHA Extensions, ARM Cryptography Extensions) que permiten que el software calcule millones de hashes SHA-256 por segundo por núcleo. No es significativamente más lento que MD5 para la mayoría de los casos de uso.

Cuándo MD5 Todavía Es Aceptable (Raramente)

"Roto" no significa "inútil para todo propósito." MD5 sigue siendo aceptable en contextos donde:

  • No hay adversario: detectar corrupción accidental de archivos en un sistema interno de confianza — no verificar descargas de internet, sino comprobar si una copia de archivo se completó correctamente.
  • La velocidad importa más que la seguridad: calcular claves de caché o identificadores de fragmento donde una colisión simplemente significa un fallo de caché, no una brecha de seguridad. El modelo de atacante está ausente.
  • Estás coincidiendo con un sistema externo existente: algunas API heredadas todavía envían ETags o checksums MD5. Puedes aceptar y calcular MD5 para interoperar, siempre que no lo uses para decisiones de seguridad.
  • Particionamiento de tabla hash: distribuir datos entre cubetas por MD5 de una clave. Las colisiones aquí causan desequilibrio, no fallos de seguridad.

El hilo común: MD5 es aceptable cuando la aplicación no depende de la resistencia a colisiones y no hay adversario que pueda crear entradas. En cuanto cualquiera de estas condiciones cambia — atacante presente, o colisión = fallo de seguridad — cambia a SHA-256.

Mitos Comunes Sobre MD5

"MD5 está bien si añadimos un salt"

El salting cambia la entrada para que dos usuarios con la misma contraseña obtengan hashes diferentes — previene los ataques de tabla rainbow. Pero no soluciona el problema de colisión. Un atacante con el hash MD5 con salt todavía puede atacarlo por fuerza bruta de manera eficiente porque MD5 es rápido: las GPUs modernas calculan alrededor de 10–30 mil millones de hashes MD5 por segundo. Un salt añade trabajo proporcional al espacio de búsqueda, no a la dificultad del algoritmo.

Para el hasheo de contraseñas, ni MD5 ni SHA-256 son apropiados independientemente del salting. Usa bcrypt, scrypt o Argon2.

"MD5 está bien porque solo lo usamos internamente"

Los sistemas internos se vulneran. El modelo de amenaza "el atacante no puede acceder a nuestras entradas" tiende a mantenerse hasta que un ataque a la cadena de suministro, una amenaza interna o una mala configuración expone el sistema. El ataque Flame ocurrió contra sistemas que presumiblemente tenían una confianza similar en sus controles internos.

"SHA-256 es excesivo — MD5 es más rápido"

En hardware moderno con instrucciones de aceleración SHA, SHA-256 es aproximadamente 2-5x más lento que MD5. Para la mayoría de las aplicaciones — verificaciones de integridad de archivos, firmas de API, claves de caché — la diferencia son microsegundos por operación, imperceptible en la práctica. El argumento de rendimiento a favor de MD5 sobre SHA-256 solo se sostiene en escenarios de rendimiento extremadamente alto donde incluso los microsegundos importan, e incluso entonces suele haber mejores soluciones que usar un algoritmo roto.

Guía de Migración — De MD5 a SHA-256

Hasheo de contraseñas

// INCORRECTO: MD5 para hasheo de contraseñas
const crypto = require('crypto');
const hash = crypto.createHash('md5').update(password).digest('hex');
// Tiempo de crackeo con GPU moderna: segundos a minutos
// INCORRECTO: SHA-256 para hasheo de contraseñas (sigue siendo demasiado rápido)
const crypto = require('crypto');
const hash = crypto.createHash('sha256').update(password).digest('hex');

// CORRECTO: usa bcrypt, scrypt o Argon2 para contraseñas
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash(password, 12);

Migrar los hashes de contraseñas almacenados requiere un enfoque gradual. En cada inicio de sesión exitoso: verifica la contraseña contra el hash MD5 existente, luego inmediatamente vuelve a hashear con bcrypt y reemplaza el valor almacenado. Marca cada cuenta como migrada. Después de un período razonable (90 días es típico), fuerza el restablecimiento de contraseña para cualquier cuenta que todavía use hashes MD5.

Integridad de archivos / checksums

# Linux: verificar la descarga de un archivo
sha256sum -c ubuntu-24.04-desktop-amd64.iso.sha256

# macOS
shasum -a 256 ubuntu-24.04-desktop-amd64.iso

# Windows PowerShell
Get-FileHash ubuntu-24.04-desktop-amd64.iso -Algorithm SHA256

Cambiar las comprobaciones de integridad de archivos de MD5 a SHA-256 suele ser un simple buscar y reemplazar en el código. Los dos problemas: (1) los checksums existentes almacenados en bases de datos o archivos necesitan ser recalculados y actualizados — no hay atajo; (2) las API externas o sistemas de almacenamiento que proporcionan ETags MD5 (como algunas configuraciones de S3) requieren coordinación para cambiar.

HMAC para autenticación de API

// HMAC-SHA-256 para autenticación de mensajes
const crypto = require('crypto');
const hmac = crypto.createHmac('sha256', process.env.SECRET_KEY)
  .update(message)
  .digest('hex');

Si usas HMAC-MD5 para la firma de solicitudes de API, cambia a HMAC-SHA-256. La construcción HMAC añade una clave secreta, lo que limita algunos ataques MD5, pero HMAC-MD5 tiene vulnerabilidades de extensión de longitud y el primitivo subyacente sigue comprometido. Los estándares modernos (JWT, AWS SigV4, OAuth 2.0) todos especifican HMAC-SHA-256. El generador HMAC de Toova soporta tanto HMAC-SHA-256 como HMAC-SHA-512 para pruebas.

Firmas digitales y certificados

Cualquier certificado firmado con MD5 debe ser reemitido inmediatamente — la mayoría de las autoridades de certificación dejaron de emitir certificados firmados con MD5 después de 2008, y todos los principales navegadores y sistemas operativos los rechazan. Para PKI interno, audita la configuración de tu CA y asegúrate de que SHA-256 sea el algoritmo mínimo de firma permitido. RSA-SHA256 o ECDSA-SHA256 son los estándares actuales.

MD5 vs SHA-256 — Referencia Rápida

Propiedad MD5 SHA-256
Longitud de salida 128 bits (32 chars hex) 256 bits (64 chars hex)
Resistencia a colisiones Rota (ataques prácticos) Segura (sin ataques conocidos)
Hasheo de contraseñas Nunca No (usa bcrypt/Argon2)
Firmas digitales Nunca
Integridad de archivos (seguridad) Nunca
Checksums sin relevancia de seguridad Aceptable (sin atacante) Siempre válido
Claves de caché Aceptable Siempre válido
Firma de certificados TLS Rechazado por navegadores Estándar
Cumplimiento FIPS 140-3 No (deprecado)

Conclusión

MD5 ha estado criptográficamente roto desde 2004. Las colisiones de prefijo elegido — la técnica que impulsó el malware Flame — son ahora computacionalmente baratas. Cualquier aplicación que dependa de MD5 para la seguridad (firmas, verificación de integridad, autenticación) es vulnerable a ataques que cuestan minutos de tiempo de cómputo.

SHA-256 no tiene ataques prácticos conocidos, está acelerado por hardware en las CPUs modernas y es el estándar de integridad criptográfica en TLS, firma de código y autenticación de API. El coste de rendimiento comparado con MD5 es insignificante para casi todos los casos de uso.

La ruta de migración es sencilla: las comprobaciones de integridad de archivos son un buscar y reemplazar. Las firmas de API requieren coordinar un cambio de versión. Los hashes de contraseñas necesitan una estrategia de rehasheo gradual en el inicio de sesión. Para cualquier código nuevo, SHA-256 debe ser la opción predeterminada. Calcula y compara hashes directamente con MD5 de Toova y SHA-256 de Toova — o genera códigos de autenticación HMAC-SHA-256 con el generador HMAC.