Comparacion de Algoritmos Hash: ¿Cuando usar MD5, SHA, Bcrypt?
Comparamos las caracteristicas y usos de varios algoritmos hash y proporcionamos una guia de seleccion para cada situacion.

¿Que es una funcion hash?
Una funcion hash es una funcion matematica que convierte datos de cualquier tamano en un valor de tamano fijo y unico. Este valor convertido se llama hash, digest o checksum. Las funciones hash son componentes fundamentales de la seguridad informatica moderna, utilizadas en todo, desde almacenamiento de contrasenas hasta blockchain.
Para entender las funciones hash, usemos una analogia. Una funcion hash es como una picadora de carne que convierte carne en hamburguesas. Si pones los mismos ingredientes, siempre obtienes el mismo resultado, pero es imposible restaurar la forma original de la carne desde la hamburguesa. Esta es la caracteristica esencial de las funciones hash.
Propiedades esenciales de las funciones hash
Una funcion hash criptografica segura debe tener estas cuatro propiedades esenciales.
1. Determinista
La misma entrada siempre produce la misma salida. Sin esta propiedad, el hash no podria usarse para verificacion de datos.
// Siempre el mismo resultado
MD5("Hello") === "8b1a9953c4611296a827abf8c47804d7" // true
MD5("Hello") === "8b1a9953c4611296a827abf8c47804d7" // true (siempre)
2. Unidireccional (One-way)
Debe ser computacionalmente imposible revertir el hash al dato original. Gracias a esta propiedad, el hash puede usarse de forma segura para almacenar contrasenas. Incluso si la base de datos se filtra, no se puede saber la contrasena original solo con el valor hash.
3. Resistencia a colisiones
Cuando dos entradas diferentes producen el mismo valor hash, se llama colision. Una buena funcion hash debe hacer extremadamente dificil encontrar colisiones. La razon por la que MD5 y SHA-1 ya no se recomiendan para seguridad es precisamente porque se han encontrado colisiones.
4. Efecto avalancha
Si cambia incluso 1 bit de la entrada, la salida debe cambiar completamente. Esta propiedad previene inferir patrones de hash a partir de entradas similares.
MD5("Hello") = "8b1a9953c4611296a827abf8c47804d7"
MD5("hello") = "5d41402abc4b2a76b9719d911017c592"
// Una letra mayuscula de diferencia pero resultado completamente diferente
Analisis detallado de los principales algoritmos hash
MD5: ¿Por que ya no debe usarse para seguridad?
MD5 es una funcion hash de 128 bits disenada por Ronald Rivest en 1991. Fue una de las mas ampliamente usadas, pero actualmente no debe usarse para propositos de seguridad.
Entrada: "Hello World"
Salida: b10a8db164e0754105b7a99be72e3fe5
Longitud: 128 bits (32 caracteres hex)
La caida de MD5: En 2004, el equipo de investigacion de Wang Xiaoyun en China descubrio colisiones en MD5. Despues, en 2008, las colisiones de MD5 fueron explotadas para generar certificados SSL falsos. Actualmente, incluso computadoras ordinarias pueden generar colisiones MD5 en segundos.
Cuando aun se puede usar MD5:
- Verificacion de integridad de descargas de archivos (proposito de deteccion de errores, no seguridad)
- Generacion de claves de cache
- Checksums no seguros
SHA-1: El ataque SHAttered de Google
SHA-1 es una funcion hash de 160 bits disenada por la NSA y estandarizada por NIST. Se consideraba mas segura que MD5, pero en 2017 Google y CWI Amsterdam demostraron una colision a traves del ataque "SHAttered".
En este ataque, los investigadores generaron dos archivos PDF con el mismo hash SHA-1 pero contenido diferente. La cantidad de calculo usada fue equivalente a 6,500 anos de tiempo de CPU y 110 anos de tiempo de GPU. Aunque requirio recursos enormes, en el momento en que se demostro que la colision era posible, la fiabilidad de seguridad de SHA-1 termino.
Estado actual: La mayoria de navegadores y autoridades de certificacion rechazan certificados SHA-1.
SHA-256 (SHA-2): El estandar actual
La familia SHA-2 es sucesora de SHA-1, con variantes como SHA-224, SHA-256, SHA-384, SHA-512. De estas, SHA-256 es la mas ampliamente usada.
Entrada: "Hello World"
Salida: a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e
Longitud: 256 bits (64 caracteres hex)
SHA-256 y Bitcoin: Bitcoin usa SHA-256 como su nucleo. Los mineros realizan trillones de calculos hash para encontrar un valor nonce donde el hash SHA-256 del encabezado del bloque cumpla ciertas condiciones (muchos ceros al principio). La imprevisibilidad de SHA-256 hace este proceso justo.
Usos:
- Firmas digitales (con RSA, ECDSA)
- Certificados SSL/TLS
- Blockchain
- Verificacion de integridad de archivos
SHA-3: El nuevo enfoque de Keccak
SHA-3 es la ultima funcion hash estandarizada por NIST en 2015. Usa una estructura completamente diferente a SHA-2 (estructura esponja), por lo que incluso si se encuentra una vulnerabilidad en SHA-2, SHA-3 no se veria afectado.
La filosofia de diseno de SHA-3 fue "hagamoslo diferente". Mientras SHA-2 usa la estructura Merkle-Damgard, el algoritmo Keccak de SHA-3 se basa en funciones esponja. Es una especie de seguro. SHA-2 aun es seguro, pero hay una alternativa preparada para futuros ataques.
Bcrypt: Hash especial para contrasenas
Bcrypt, a diferencia de los hash de proposito general, esta disenado intencionalmente para ser lento. En el hashing de contrasenas, "lento" es una ventaja. Porque impide que los atacantes prueben miles de millones de contrasenas por segundo.
// Usando factor de trabajo (cost) 12
bcrypt.hash("password", 12)
// Ejemplo de salida
$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/X4.VVzfQl0Pfy6.nO
Estructura del hash Bcrypt:
$2b$- Version del algoritmo12$- Factor de trabajo (2^12 = 4,096 iteraciones)- Siguientes 22 caracteres - Salt (codificado en Base64)
- Resto - Valor hash real
Cada vez que el factor de trabajo aumenta en 1, el tiempo de calculo se duplica. El valor recomendado actualmente es 10-12.
Argon2: El hash de contrasenas mas moderno
Argon2 es el algoritmo que gano el Password Hashing Competition en 2015. Esta disenado para ser intensivo en memoria, siendo resistente a ataques paralelos con GPU.
Parametros:
- Memoria: Cuanta RAM usar
- Tiempo: Cuanto tiempo calcular
- Paralelismo: Cuantos hilos usar
La variante Argon2id es recomendada para uso general. Para proyectos nuevos usa Argon2, y si necesitas compatibilidad con sistemas legacy usa Bcrypt.
Guia practica de uso
Almacenamiento de contrasenas: Salt y Pepper
Salt: Agrega un valor aleatorio unico a cada contrasena. Incluso la misma contrasena genera diferentes valores hash, neutralizando los ataques de rainbow table.
// Usando Salt
password: "password123"
salt: "x7Gh9kL2" (generado aleatoriamente)
hash: bcrypt("password123" + "x7Gh9kL2")
Pepper: Mientras que Salt se almacena junto con el hash en la base de datos, Pepper se gestiona como un secreto separado (variables de entorno, modulos de seguridad de hardware, etc.). Sin el Pepper, no se puede verificar la contrasena incluso si la base de datos se filtra.
Verificacion de integridad de archivos
Proporcionar checksums SHA-256 al distribuir software permite verificar que el archivo descargado no ha sido manipulado.
# Generar hash de archivo
sha256sum ubuntu-22.04.iso
# a1b2c3d4e5f6... ubuntu-22.04.iso
# Verificacion
echo "a1b2c3d4e5f6... ubuntu-22.04.iso" | sha256sum --check
Guia de seleccion de algoritmos por uso
| Uso | Algoritmo Recomendado | No Recomendado |
|---|---|---|
| Almacenamiento de contrasenas | Argon2id, Bcrypt, PBKDF2 | MD5, familia SHA (demasiado rapidos) |
| Integridad de archivos | SHA-256, SHA-512 | MD5 (colisiones posibles) |
| Firmas digitales | SHA-256 + RSA/ECDSA | SHA-1 (ataque de colision) |
| Tokens API | HMAC-SHA256 | - |
| Claves de cache | MD5, SHA-1 (rapidos) | - |
Ejemplos de codigo
Node.js
const crypto = require('crypto');
const bcrypt = require('bcrypt');
// SHA-256
const sha256 = crypto.createHash('sha256')
.update('Hello World')
.digest('hex');
// Bcrypt
const hash = await bcrypt.hash('password', 12);
const isValid = await bcrypt.compare('password', hash);
Python
import hashlib
import bcrypt
# SHA-256
sha256 = hashlib.sha256(b'Hello World').hexdigest()
# Bcrypt
hashed = bcrypt.hashpw(b'password', bcrypt.gensalt(12))
is_valid = bcrypt.checkpw(b'password', hashed)
Herramientas Hash de Toolypet
Con las herramientas hash de Toolypet puedes generar y verificar rapidamente varios hashes:
- Generador MD5/SHA: Calcula instantaneamente el hash de texto o archivos
- Herramienta Bcrypt: Genera y verifica hashes de contrasenas
- Comparacion de Hash: Compara dos valores hash de forma segura (prevencion de timing attacks)
Maneja tus tareas de hash necesarias para desarrollo y pruebas facilmente en Toolypet.