Utilo

MD5 vs SHA-256: Diferencias, seguridad y cuándo usar cada uno

Compare MD5, SHA-1, SHA-256 y SHA-3: cómo funcionan las funciones hash, por qué MD5 está roto, velocidad, sumas de comprobación, HMAC y la forma correcta de hashar las contraseñas.

· 7 min de lectura

Las funciones hash se encuentran entre los bloques de construcción más utilizados en el software. Verifican las descargas, deduplican archivos, firman solicitudes de API, alimentan Git y cadenas de bloques, y protegen las contraseñas almacenadas. MD5 y SHA-256 son los dos nombres que los desarrolladores encuentran con más frecuencia, y la pregunta "¿todavía puedo usar MD5?" La respuesta corta: para cualquier cosa que involucre seguridad, no; para detectar corrupción accidental, todavía funciona. La respuesta más larga explica por qué, y qué usar en su lugar.

Qué hace una función hash criptográfica

Una función hash toma entrada de cualquier longitud y produce una salida de longitud fija llamada digest. MD5 produce 128 bits (32 caracteres hexagonales); SHA-256 produce 256 bits (64 caracteres hexagonales).

MD5("hello world")     = 5eb63bbbe01eeed093cb22bb8f5acdc3
SHA-256("hello world") = b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9

Un buen hash criptográfico tiene tres propiedades de seguridad:

  1. Resistencia de preimagen: dada una digestión, es imposible encontrar cualquier entrada que la produzca.
  2. Resistencia a la segunda preimagen: dada una entrada, es imposible encontrar una entrada diferente con el mismo resumen.
  3. Resistencia a colisiones: es imposible encontrar dos entradas diferentes con el mismo digesto.

También debería mostrar el efecto avalancha: cambiar un solo bit de entrada cambia aproximadamente la mitad de los bits de salida, por lo que entradas similares tienen resúmenes completamente no relacionados. Prueba en un generador de hash: "hola mundo" y "hola mundo!" producen digestiones sin nada en común.

Una breve historia de la MD5

Ron Rivest diseñó el MD5 en 1991. Fue rápido y se hizo omnipresente: suma de verificación de archivos, almacenamiento de contraseñas, certificados digitales. Las debilidades aparecieron en pocos años, y en 2004 los investigadores demostraron colisiones prácticas. En 2008, un equipo creó un certificado de autoridad de certificados deshonesto explotando colisiones MD5, y en 2012 el malware Flame utilizó una colisión MD5 para falsificar certificados de firma de código de Microsoft. Hoy en día, generar una colisión MD5 toma segundos en un portátil.

Los ataques de preimagen en MD5 siguen siendo teóricos, pero la resistencia a la colisión está completamente rota, y eso es suficiente para descartarlo para firmas, certificados y controles de integridad donde un atacante podría estar involucrado.

SHA-1: también retirado

SHA-1, con salida de 160 bits, siguió un camino similar. Las debilidades teóricas se publicaron en 2005, y en 2017 Google y CWI Amsterdam produjeron la primera colisión real ("SHAttered"): dos archivos PDF diferentes con el mismo hash SHA-1. Los navegadores dejaron de aceptar certificados SHA-1, y Git está migrando a SHA-256. Trate a SHA-1 como si fuera MD5.

SHA-256 y la familia SHA-2

SHA-2, publicado por el NIST en 2001, incluye SHA-224, SHA-256, SHA-384 y SHA-512. SHA-256 es el más ampliamente utilizado: certificados TLS, firma de código, Bitcoin, administradores de paquetes, integridad de subrecursos, firmas JWT (HS256 y RS256) y mucho más. Después de más de dos décadas de análisis, no existen ataques prácticos contra su resistencia a la colisión o a la preimagen.

SHA-512 utiliza operaciones de 64 bits y es a menudo más rápido que SHA-256 en CPU de 64 bits sin aceleración de hardware. SHA-384 es un SHA-512 truncado que también resiste ataques de extensión de longitud.

SHA-3

SHA-3 (Keccak), estandarizado en 2015, utiliza un diseño interno completamente diferente una construcción de esponja por lo que un avance contra SHA-2 no lo afectaría automáticamente. No es un reemplazo para SHA-2 tanto como una copia de seguridad con propiedades diferentes. Utilizarlo cuando una especificación lo requiere; de lo contrario, SHA-256 sigue siendo el estándar pragmático.

Comparación recíproca

El algoritmo Tamaño de salida Resistencia a las colisiones Estatus de las personas
El MD5 128 bits Se rompió (segundos) No por seguridad.
SHA-1 160 bits Rompió (2017) No por seguridad.
SHA-256: el código de código de la empresa 256 bits Asegurado Recomendado por defecto
SHA-512: el nombre de la empresa. 512 bits Asegurado Recomendado
SHA3-256 / SHA3-512 256 / 512 bits Asegurado Alternativa recomendada
- ¿ Qué es? 256 bits (extensibles) Asegurado Adopción muy rápida y creciente

Velocidad

MD5 es más rápido que SHA-256 en software puro, pero la brecha importa menos de lo que la gente piensa. Los procesadores x86 y ARM modernos incluyen instrucciones de hardware SHA-256, que hacen que SHA-256 se ejecute a gigabytes por segundo. En la práctica, la lectura de un archivo desde el disco o la red es generalmente el cuello de botella, no el hash. Si la velocidad en bruto es crítica para usos no de seguridad, BLAKE3 o hashes no criptográficos como xxHash superan a ambos.

Cuando el MD5 es todavía aceptable

La debilidad de colisión de MD5 solo importa cuando alguien puede crear entradas deliberadamente. Sigue siendo aceptable para:

  • ** Detección de corrupción accidental** en transferencias o almacenamiento cuando no hay ningún atacante involucrado.
  • ** Claves de caché y deduplicación** de datos de confianza, por ejemplo, almacenando sus propios archivos.
  • ** Compatibilidad legada**, como sistemas que sólo publican sumas de comprobación MD5 o protocolos que lo requieren.

Incluso en estos casos, elegir SHA-256 cuesta poco y elimina la necesidad de argumentar que ningún atacante podría estar involucrado. Muchos incidentes comenzaron con una suma de comprobación que era "sólo para la corrupción" y se confió en ella para la seguridad más tarde.

Verificación de descargas correctas

Cuando un proyecto publica una suma de comprobación SHA-256, calcular el hash de su descarga y comparar cada carácter:

sha256sum ubuntu.iso          # Linux
shasum -a 256 ubuntu.iso      # macOS
Get-FileHash ubuntu.iso       # Windows PowerShell

Una suma de comprobación que coincide prueba que el archivo coincide con lo que el editor hashed. No prueba que el editor sea legítimo: si un atacante controla el sitio web, puede reemplazar tanto el archivo como la suma de comprobación. Las sumas de comprobación firmadas (GPG o Sigstore) cierran esa brecha.

HMAC: hashing con una clave

Un simple hash prueba la integridad pero no la autenticidad cualquiera puede calcularlo. HMAC combina una clave secreta con el mensaje, por lo que solo las partes con la clave pueden producir o verificar el resultado. Los webhooks de Stripe, GitHub y Slack utilizan firmas HMAC-SHA256, y JWTs firmados con HS256 están HMAC-SHA256 bajo el capó.

No construya su propio hash con clave concatenando secret + message y hashándolo. Con MD5, SHA-1 y SHA-256, esto es vulnerable a los ataques de extensión de longitud. Utilice la construcción estándar HMAC, que todos los lenguajes proporcionan. Al comparar firmas, use una función de comparación de tiempo constante para evitar ataques de tiempo.

Las contraseñas necesitan una herramienta completamente diferente

Ni MD5 ni SHA-256 deben usarse directamente para almacenar contraseñas. Los hashes rápidos son una desventaja aquí: una GPU moderna calcula miles de millones de hashes SHA-256 por segundo, por lo que un atacante que roba su base de datos puede probar enormes listas de posibles contraseñas rápidamente. Los hashes sin sal son peores, porque las tablas precomputadas descifran contraseñas comunes al instante.

Utilice una función de hash de contraseña diseñada para ser lenta y dura en la memoria:

  • Argon2id el ganador del Concurso de Hashing de Contraseñas y la primera opción actual.
  • scrypt difícil de recordar y ampliamente disponible.
  • bcrypt más antiguo pero todavía aceptable, con un límite de entrada de 72 bytes.
  • PBKDF2 con un alto número de iteraciones cuando el cumplimiento requiere primitivas aprobadas por el NIST.

Estas funciones añaden una sal única por contraseña y un factor de costo configurable que se puede aumentar a medida que el hardware se vuelve más rápido. Las bibliotecas se encargan de los detalles: llamas a hash(password) y verify(password, stored).

Digest de codificación

Los digestos son bytes en bruto, generalmente mostrados como hexadecimal (dos caracteres por byte) o Base64 (más compacto). El mismo resumen SHA-256 es de 64 caracteres hex o 44 caracteres Base64. Los atributos de integridad de subrecursos usan Base64 (sha384-...), mientras que los archivos de suma de comprobación usan hex. Para más información sobre el lado de la codificación, vea [Base64 explicado] ((/blog/base64-explicado).

Guía para la toma de decisiones

  • Chequeo de integridad, firmas, certificados, cualquier cosa relacionada con la seguridad: SHA-256 (o SHA-512, SHA-3, BLAKE3).
  • ** Autenticación de mensajes con un secreto compartido:** HMAC-SHA256.
  • ** Almacenamiento de contraseñas:** Argon2id, scrypt o bcrypt nunca un hash simple.
  • ** Sumas de verificación no adversarias o claves de caché:** MD5 funciona, pero SHA-256 es el hábito más seguro.
  • Hashing no de seguridad de muy alta velocidad (tablas de hash, fragmentación): xxHash o hashes no criptográficos similares.

Resumen

MD5 y SHA-1 están rotos para resistencia a colisiones y no deben usarse cuando un atacante pueda beneficiarse de entradas de elaboración. SHA-256 es seguro, rápido con soporte de hardware y el valor predeterminado correcto para la integridad y las firmas. Utilice HMAC para la autenticación con llave y funciones lentas dedicadas como Argon2id para contraseñas. En caso de duda, elija SHA-256 nunca es la respuesta equivocada para la integridad, y MD5 cada vez más lo es.

Esta página se tradujo automáticamente del inglés. Si encuentras un error, avísanos.

Guías relacionadas