Toolypet
Back to Blog
Security

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.

Toolypet Team7 min read
Comparacion de Algoritmos Hash: ¿Cuando usar MD5, SHA, Bcrypt?

¿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 algoritmo
  • 12$ - 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

UsoAlgoritmo RecomendadoNo Recomendado
Almacenamiento de contrasenasArgon2id, Bcrypt, PBKDF2MD5, familia SHA (demasiado rapidos)
Integridad de archivosSHA-256, SHA-512MD5 (colisiones posibles)
Firmas digitalesSHA-256 + RSA/ECDSASHA-1 (ataque de colision)
Tokens APIHMAC-SHA256-
Claves de cacheMD5, 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.

HashMD5SHABcryptCryptography