Las funciones hash son uno de los bloques de construcción más fundamentales en computación. Aparecen en el almacenamiento de contraseñas, la verificación de integridad de archivos, las firmas digitales, blockchain, el caché y la deduplicación de datos. Sin embargo, muchos desarrolladores usan funciones hash sin entender completamente qué hace a un algoritmo mejor que otro, o por qué MD5 está deprecado para propósitos de seguridad pero sigue siendo perfectamente válido para sumas de verificación. Entender estas distinciones previene errores graves y te ayuda a elegir la herramienta correcta para cada trabajo.
Qué Hace Realmente una Función Hash
Una función hash criptográfica toma una entrada de cualquier longitud y produce una salida de longitud fija llamada resumen o hash. SHA-256 siempre produce una salida de 256 bits (32 bytes) independientemente de si la entrada es un solo carácter o un archivo de 10 GB. La salida se muestra típicamente como una cadena hexadecimal.
Tres propiedades definen una función hash criptográfica. Primero, el determinismo: la misma entrada siempre produce la misma salida. Segundo, el efecto avalancha: un solo bit cambiado en la entrada produce una salida completamente diferente. Tercero, la resistencia a la preimagen: dado un resultado hash, es computacionalmente inviable encontrar la entrada original.
Las funciones hash son unidireccionales por diseño. No puedes revertir un hash para recuperar la entrada original — solo puedes verificar una entrada candidata hasheándola y comparando. Por esto el hash se usa para el almacenamiento de contraseñas: la base de datos almacena el hash, no la contraseña.
MD5: Rápido pero Criptográficamente Roto
MD5 produce un resumen de 128 bits (32 caracteres hex) y es extremadamente rápido. Fue diseñado en 1991 y fue ampliamente usado para el hash de contraseñas y firmas digitales durante los años 90 y 2000. Sin embargo, los investigadores demostraron ataques de colisión prácticos contra MD5 en 2004 — lo que significa que dos entradas diferentes pueden diseñarse para producir el mismo hash.
Un ataque de colisión significa que un atacante puede crear un archivo malicioso que tenga el mismo hash MD5 que un archivo legítimo, permitiéndole sustituir el archivo malicioso mientras la verificación del hash pasa. Por esto MD5 está deprecado para cualquier propósito de seguridad: firma de certificados, autenticación de mensajes o almacenamiento de contraseñas.
MD5 sigue siendo apropiado para usos no relacionados con la seguridad donde la velocidad importa y la resistencia a colisiones no es necesaria: sumas de verificación para detectar corrupción accidental, claves de caché, identificadores de deduplicación y claves de particionamiento en sistemas distribuidos.
SHA-256 y SHA-512: El Estándar Moderno
SHA-256 es parte de la familia SHA-2, diseñada por la NSA y publicada en 2001. Produce un resumen de 256 bits (64 caracteres hex). No existen ataques de colisión prácticos contra SHA-256 a partir de 2025. Es el estándar actual para firmas digitales, hash de certificados, autenticación basada en HMAC y prueba de trabajo en blockchain.
SHA-512 produce un resumen de 512 bits (128 caracteres hex). Es más lento que SHA-256 en sistemas de 32 bits pero más rápido en sistemas de 64 bits debido a las operaciones internas de palabras de 64 bits. El resumen más grande proporciona un mayor margen de seguridad, relevante para el archivado de documentos a largo plazo.
SHA-3 (Keccak) es una tercera familia publicada en 2015 como alternativa a SHA-2, no como reemplazo. Usa una estructura interna completamente diferente (construcción de esponja vs. Merkle-Damgard), proporcionando diversidad algorítmica en caso de que alguna vez se descubran debilidades teóricas en SHA-2.
Funciones Hash vs. Funciones Hash de Contraseñas
Las funciones hash de propósito general como SHA-256 y MD5 están diseñadas para ser rápidas. Esta es exactamente la propiedad incorrecta para el almacenamiento de contraseñas. Un hash rápido permite a un atacante que obtiene tu base de datos de contraseñas probar miles de millones de contraseñas candidatas por segundo.
Las funciones hash de contraseñas — bcrypt, Argon2, scrypt — son intencionalmente lentas y consumen mucha memoria. Incluyen un factor de costo que puedes ajustar para mantener el cómputo de hash en aproximadamente 100–300ms, haciendo los ataques de fuerza bruta millones de veces más lentos.
La regla es absoluta: nunca almacenes contraseñas hasheadas con MD5, SHA-1, SHA-256 o cualquier función hash de propósito general. Usa siempre bcrypt, Argon2id (la elección recomendada por NIST) o scrypt. Usar SHA-256 para hashear una contraseña es un error bien intencionado que deja a tus usuarios expuestos en caso de una brecha de base de datos.
Las funciones hash no son intercambiables. MD5 es apropiado para sumas de verificación y claves de caché, no para seguridad. SHA-256 es el estándar para firmas digitales, verificación de integridad de datos y autenticación HMAC. El almacenamiento de contraseñas requiere una función hash de contraseñas dedicada, nunca un hash de propósito general. Un generador de hash es una herramienta de depuración invaluable que te permite verificar salidas de hash, probar entradas HMAC e inspeccionar verificaciones de integridad de archivos sin escribir scripts utilitarios.