Skip to content
Volver al blog
Tutoriales

MD5 vs SHA-256: Comparación de Algoritmos Hash para Desarrolladores

Compara MD5, SHA-1, SHA-256 y SHA-512 en seguridad, velocidad, tamaño de salida y casos de uso reales. Aprende qué hash elegir para checksums, verificación de integridad y almacenamiento de contraseñas.

12 min de lectura

MD5 vs SHA-256: ¿Qué Algoritmo Hash Deberías Usar?

El hashing es una de las operaciones más fundamentales en la informática — pero elegir el algoritmo equivocado puede exponer tu sistema a ataques de colisión, corrupción de datos o una sobrecarga de rendimiento innecesaria. Esta guía compara los cuatro algoritmos hash más usados y te ofrece un marco de decisión claro.

¿Qué Es una Función Hash?

Una función hash criptográfica toma datos de entrada arbitrarios y produce una salida de tamaño fijo (el “digest” o “hash”). Las buenas funciones hash tienen tres propiedades:

  1. Determinista: La misma entrada siempre produce la misma salida.
  2. Unidireccional: No puedes invertir el hash para recuperar la entrada original.
  3. Resistente a colisiones: Debe ser computacionalmente inviable encontrar dos entradas diferentes que produzcan el mismo hash.

Cuando la propiedad #3 falla, el algoritmo se considera “criptográficamente roto” — esto es exactamente lo que ocurrió con MD5 y SHA-1.

Comparación Rápida de Algoritmos

PropiedadMD5SHA-1SHA-256SHA-512
Tamaño de salida128 bits (32 caracteres hex)160 bits (40 caracteres hex)256 bits (64 caracteres hex)512 bits (128 caracteres hex)
Tamaño de bloque512 bits512 bits512 bits1024 bits
Año de introducción1991199520012001
DiseñadorRon RivestNSA / NISTNSA / NISTNSA / NIST
Resistencia a colisionesRoto (2004)Roto (2017)SeguroSeguro
Velocidad (relativa)Más rápidoRápidoModeradoModerado (más rápido en 64 bits)
Estado NISTObsoletoObsoletoRecomendadoRecomendado

MD5: Rápido pero Roto

MD5 (Message-Digest Algorithm 5) fue diseñado por Ronald Rivest en 1991 y se convirtió en el estándar de facto para checksums durante los años 90 y principios de los 2000. Produce un hash de 128 bits en 32 caracteres hexadecimales.

Por Qué MD5 Está Roto

En 2004, Xiaoyun Wang demostró ataques de colisión prácticos contra MD5. En 2008, los investigadores crearon un certificado SSL fraudulento usando colisiones de MD5, demostrando que el ataque no era solo teórico. Hoy en día, las colisiones de MD5 pueden generarse en segundos en hardware de consumo.

// Generar un hash MD5 (solo para uso no relacionado con seguridad)
// La Web Crypto API no está disponible para MD5 — usa una biblioteca
import { md5 } from 'hash-wasm';

const hash = await md5('Hello, World!');
console.log(hash);
// → 'bea8252ff4e80f41719ea13cdf007273' (32 caracteres hex)

Cuándo MD5 Sigue Siendo Aceptable

A pesar de estar criptográficamente roto, MD5 sigue siendo útil para aplicaciones no relacionadas con seguridad:

  • Deduplicación de archivos: Detectar archivos duplicados en sistemas de almacenamiento
  • Claves de caché: Generar claves cortas y deterministas para búsquedas en caché
  • Checksums de integridad de datos: Verificación rápida de que los datos no se corrompieron accidentalmente (no deliberadamente manipulados)
  • Compatibilidad con sistemas heredados: Interoperar con sistemas más antiguos que requieren MD5

La distinción clave: MD5 protege contra la corrupción accidental, pero no contra la manipulación deliberada.

SHA-1: Obsoleto pero Persistente

SHA-1 (Secure Hash Algorithm 1) fue diseñado por la NSA y publicado por el NIST en 1995. Produce un hash de 160 bits en 40 caracteres hexadecimales.

En 2017, Google y CWI Amsterdam demostraron la primera colisión SHA-1 práctica (el ataque “SHAttered”), generando dos archivos PDF diferentes con el mismo hash SHA-1. Los principales navegadores y autoridades de certificación ya habían comenzado a rechazar los certificados SHA-1 en 2016.

Usa SHA-1 únicamente para compatibilidad con sistemas que lo requieran (por ejemplo, Git usa SHA-1 para los hashes de commits, aunque está en transición a SHA-256). Para cualquier desarrollo nuevo, elige SHA-256 o superior.

SHA-256: El Estándar Actual

SHA-256 forma parte de la familia SHA-2, diseñada por la NSA y publicada por el NIST en 2001. Produce un hash de 256 bits en 64 caracteres hexadecimales y es el algoritmo recomendado para prácticamente todas las necesidades de hashing en 2026.

// Generar un hash SHA-256 usando la Web Crypto API (nativa del navegador)
async function sha256(text) {
  const data = new TextEncoder().encode(text);
  const hash = await crypto.subtle.digest('SHA-256', data);
  return Array.from(new Uint8Array(hash))
    .map(b => b.toString(16).padStart(2, '0'))
    .join('');
}

const hash = await sha256('Hello, World!');
console.log(hash);
// → 'dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f'

Por Qué SHA-256 Es la Opción Predeterminada

  • Sin ataques conocidos: A fecha de 2026, no existen ataques prácticos de colisión o preimagen
  • Nativo del navegador: Disponible a través de la Web Crypto API en todos los navegadores modernos — no se necesitan bibliotecas
  • Estándar de la industria: Usado por certificados TLS, Bitcoin, gestores de paquetes (npm, pip), digests de imágenes Docker y la mayoría de los sistemas de verificación de integridad
  • Aprobado por NIST: Recomendado para todas las aplicaciones sensibles a la seguridad

SHA-512: Cuando Necesitas Más

SHA-512 produce un hash de 512 bits en 128 caracteres hexadecimales. Usa un tamaño de bloque de 1024 bits (frente a los 512 bits de SHA-256), lo que lo hace más rápido que SHA-256 en procesadores de 64 bits porque procesa más datos por ciclo.

# Python: SHA-512 es igual de fácil que SHA-256
import hashlib

hash_256 = hashlib.sha256(b'Hello, World!').hexdigest()
hash_512 = hashlib.sha512(b'Hello, World!').hexdigest()

print(f"SHA-256: {hash_256}")  # 64 caracteres
print(f"SHA-512: {hash_512}")  # 128 caracteres

Usa SHA-512 cuando:

  • Necesitas un margen de seguridad mayor (resistencia a colisiones de 256 bits frente a 128 bits para SHA-256)
  • Tu plataforma es de 64 bits y el rendimiento importa (SHA-512 puede ser 1,5 veces más rápido que SHA-256 en x86-64)
  • El protocolo o especificación lo requiere (algunos esquemas de certificados, requisitos específicos de cumplimiento)

Para la mayoría de las aplicaciones, SHA-256 es suficiente. La longitud adicional de los hashes SHA-512 dobla el almacenamiento y el ancho de banda sin un beneficio de seguridad práctico para los casos de uso típicos.

Marco de Decisión: Qué Hash Usar

Para integridad de archivos y checksums

Usa SHA-256. Es el estándar para verificar descargas, comparar contenidos de archivos y asegurarse de que los datos no se corrompieron. Si estás reemplazando un sistema basado en MD5, SHA-256 es la actualización directa.

# Verificar la integridad de una descarga
sha256sum archivo-descargado.tar.gz
# Compara la salida con el hash publicado

Para almacenamiento de contraseñas

No uses ni MD5 ni SHA-256 directamente. Las funciones hash de propósito general son demasiado rápidas para el hashing de contraseñas — un atacante puede probar miles de millones de intentos por segundo. En su lugar, usa un algoritmo dedicado de hashing de contraseñas:

AlgoritmoEstadoNotas
Argon2idRecomendadoGanador de la Password Hashing Competition de 2015; resistente a memoria
bcryptBuenoAmpliamente soportado; salt incorporado; factor de trabajo ajustable
scryptBuenoResistente a memoria; usado por algunos sistemas de criptomonedas
PBKDF2AceptableAprobado por NIST pero no resistente a memoria; usa ≥600.000 iteraciones
SHA-256InadecuadoDemasiado rápido; sin salt incorporado; vulnerable a ataques GPU
MD5PeligrosoRoto + demasiado rápido; descifrado trivialmente
// MAL: No hagas hash de contraseñas con SHA-256
const hash = await sha256(password); // Descifrable a miles de millones/seg

// BIEN: Usa bcrypt (ejemplo en Node.js)
import bcrypt from 'bcrypt';
const hash = await bcrypt.hash(password, 12); // 12 rondas = ~250ms
const isValid = await bcrypt.compare(input, hash);

Para HMAC y autenticación de mensajes

Usa SHA-256 con HMAC. HMAC (Hash-based Message Authentication Code) combina una función hash con una clave secreta para verificar tanto la integridad como la autenticidad:

// HMAC-SHA256 para verificación de firma de webhook
async function verifyWebhook(payload, signature, secret) {
  const key = await crypto.subtle.importKey(
    'raw', new TextEncoder().encode(secret),
    { name: 'HMAC', hash: 'SHA-256' }, false, ['verify']
  );
  const sig = Uint8Array.from(atob(signature), c => c.charCodeAt(0));
  return crypto.subtle.verify('HMAC', key, sig, new TextEncoder().encode(payload));
}

Para almacenamiento con direccionamiento por contenido

Usa SHA-256. Git, Docker e IPFS usan almacenamiento con direccionamiento por contenido donde el hash del contenido sirve como su dirección. SHA-256 proporciona suficiente resistencia a colisiones para garantizar la unicidad en miles de millones de objetos.

Benchmarks de Rendimiento

Velocidad relativa de hashing en un procesador x86-64 moderno (mayor = más rápido):

AlgoritmoRendimiento (MB/s)Velocidad relativa
MD5~3.2001,0x (base)
SHA-1~2.4000,75x
SHA-256~1.5000,47x
SHA-512~2.1000,66x

Nota: SHA-512 es más rápido que SHA-256 en procesadores de 64 bits debido a su estado interno más amplio. En sistemas de 32 bits, la situación se invierte. Para la mayoría de las aplicaciones, la diferencia de velocidad es irrelevante — el hash de un archivo de 1 MB tarda menos de 1 ms con cualquiera de estos algoritmos.

Errores Comunes a Evitar

1. Usar MD5 para seguridad

Las colisiones de MD5 son triviales de generar. Nunca uses MD5 para firmas digitales, validación de certificados o cualquier escenario donde un atacante pudiera crear entradas maliciosas.

2. Hacer hash de contraseñas con SHA-256

SHA-256 no es un hash de contraseñas. Es demasiado rápido, no tiene salt incorporado y es vulnerable a ataques de tablas arcoíris y fuerza bruta acelerada por GPU. Usa Argon2id o bcrypt.

3. Asumir que la longitud del hash equivale a seguridad

Un hash de 512 bits no es automáticamente “más seguro” que uno de 256 bits en cuanto a resistencia a colisiones. El margen de seguridad de SHA-256 (resistencia a colisiones de 128 bits) ya está muy por encima de la capacidad de fuerza bruta. Elige según tus requisitos reales, no según la longitud del hash.

4. Crear tus propias combinaciones de hash

Patrones como SHA256(MD5(data)) o MD5(data + salt) no arreglan mágicamente un algoritmo roto. Usa un único algoritmo bien revisado (SHA-256) o una construcción adecuada (HMAC).

Pruébalo Tú Mismo

Genera y compara hashes MD5, SHA-1, SHA-256 y SHA-512 al instante con nuestro Generador de Hash — pega texto o arrastra un archivo y ve los cuatro digests uno al lado del otro. 100% en tu navegador, los datos nunca salen de tu dispositivo.

Para una visión más amplia de la seguridad web, incluyendo autenticación, validación de entradas y cabeceras de seguridad, lee nuestra guía de Seguridad Web Esencial.

Preguntas Frecuentes

¿Sigue siendo seguro MD5 para checksums?

MD5 es seguro para detectar la corrupción accidental de archivos — si un archivo se daña durante la descarga, el hash MD5 casi con certeza cambiará. Sin embargo, MD5 no es seguro contra la manipulación deliberada porque un atacante puede crear un archivo modificado con el mismo hash MD5. Para la verificación de integridad donde los adversarios son una preocupación (por ejemplo, distribución de software), usa SHA-256.

¿Cuánto más lento es SHA-256 comparado con MD5?

SHA-256 es aproximadamente 2 veces más lento que MD5 en rendimiento bruto. En hardware moderno, MD5 hace hash a unos 3.200 MB/s mientras que SHA-256 lo hace a unos 1.500 MB/s. En la práctica, esta diferencia es insignificante para la mayoría de las aplicaciones — el hash de un archivo de 100 MB tarda unos 70 ms con SHA-256. La brecha de rendimiento solo importa en escenarios de muy alto rendimiento como la inspección de paquetes de red o la deduplicación de almacenamiento a escala.

¿Debería usar SHA-256 o SHA-512 para mi aplicación?

Usa SHA-256 para la mayoría de las aplicaciones — proporciona resistencia a colisiones de 128 bits, que está muy por encima de la capacidad de fuerza bruta. Elige SHA-512 si: (a) tu plataforma es de 64 bits y necesitas el máximo rendimiento, (b) una especificación o requisito de cumplimiento lo exige, o (c) quieres un margen de seguridad mayor para la integridad de datos a largo plazo. La longitud adicional del hash SHA-512 dobla el almacenamiento y raramente es necesaria.

¿Puede SHA-256 ser descifrado o invertido?

SHA-256 no puede invertirse — es una función unidireccional. A fecha de 2026, no existen ataques prácticos de preimagen o colisión contra SHA-256. El mejor ataque conocido requiere 2¹²⁸ operaciones para colisiones, lo que es computacionalmente inviable con la tecnología actual o previsible. SHA-256 está aprobado por el NIST y se usa en infraestructura crítica incluyendo TLS, Bitcoin y sistemas federales.

¿Por qué algunos sistemas siguen usando MD5 si está roto?

La compatibilidad heredada es la razón principal. Muchos sistemas, protocolos y formatos de archivo existentes fueron diseñados alrededor de MD5 antes de que se descubrieran sus debilidades. Migrar requiere cambios coordinados en todos los componentes. Para usos no relacionados con seguridad como claves de caché y deduplicación, la ventaja de velocidad de MD5 y su salida más corta lo convierten en una opción pragmática donde los ataques de colisión no son una preocupación del modelo de amenazas.

Artículos relacionados

Ver todos los artículos