Cómo generar hashes MD5, SHA-256 y otros
El hashing convierte cualquier entrada (una contraseña, un archivo, un mensaje) en una cadena de caracteres de longitud fija. La misma entrada siempre produce el mismo hash, pero hasta un cambio diminuto en la entrada produce un hash completamente distinto. Esto hace que el hashing sea esencial para verificación de integridad, almacenamiento de contraseñas, firmas digitales, pruebas blockchain y docenas de otros bloques de construcción de la computación moderna. Elegir el algoritmo correcto, saber por qué algunos están rotos, y reconocer los patrones que mal usan los hashes convierte una herramienta de cinco segundos en una base sobre la que puedes construir con seguridad.
Breve historia de las funciones hash
El hashing como idea de programación precede a la criptografía por décadas, las tablas hash en estructuras de datos usan funciones simples como CRC y FNV para repartir claves entre buckets. Los hashes criptográficos, diseñados para ser irreversibles y resistentes a colisiones, emergieron a finales de los 80 con MD4 (1990) y MD5 (1991) de Ron Rivest. MD5 se convirtió en el estándar de facto durante dos décadas antes de que colisiones prácticas lo hicieran inseguro para trabajo de seguridad.
El SHA-0 (1993) de NIST se retiró casi inmediatamente y se reemplazó por SHA-1 (1995). SHA-1 aguantó mejor pero cayó por etapas: ataques teóricos en 2005, un escenario práctico de falsificación de certificado para 2009, y la demostración SHAttered de Google de dos PDF distintos con el mismo hash SHA-1 en 2017. La familia SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512), publicada en 2001, se diseñó como reemplazo a más largo plazo y sigue siendo segura hoy. SHA-3 (Keccak, estandarizado en 2015) es un diseño estructuralmente diferente pensado para proporcionar respaldo si SHA-2 cae alguna vez.
En paralelo, los hashes específicos para contraseñas evolucionaron por separado. MD5 o SHA-1 simples resultaron demasiado rápidos para almacenamiento de contraseñas, así que bcrypt (1999), scrypt (2009), y Argon2 (2015, ganador de la Password Hashing Competition) añadieron lentitud deliberada y dureza de memoria para hacer los ataques de fuerza bruta órdenes de magnitud más caros. El hash correcto para una contraseña nunca es el mismo que el hash correcto para una suma de comprobación de archivo.
Cómo funciona el hashing
Una función hash toma una entrada de cualquier tamaño y produce una salida de tamaño fijo:
| Entrada | Hash SHA-256 (primeros 16 car.) |
|---|---|
| hello | 2cf24dba5fb0a30e... |
| Hello | 185f8db32271fe25... |
| hello! | ce06092fb948d9ff... |
Nota que cambiar un solo carácter (h minúscula a H mayúscula) o añadir un carácter cambia completamente el hash. Esto se llama el efecto avalancha y es lo que hace útil al hashing para detectar cualquier cambio, por diminuto que sea.
Internamente, una función hash moderna divide su entrada en bloques de tamaño fijo (64 bytes para SHA-256, 128 para SHA-512), pasa cada bloque por una función de compresión y encadena el estado hacia adelante. La salida es el estado final tras incorporar el último bloque. Como la cadena depende de cada byte, no hay atajo que permita a un atacante cambiar la entrada sin reescribir todo el hash.
Un buen hash criptográfico tiene tres propiedades de seguridad: resistencia a la preimagen (no puedes encontrar una entrada que produzca un hash dado), resistencia a la segunda preimagen (dada una entrada, no puedes encontrar una distinta con el mismo hash), y resistencia a colisiones (no puedes encontrar dos entradas distintas con el mismo hash). MD5 falla las tres; SHA-1 falla la resistencia a colisiones; SHA-2 y SHA-3 aún mantienen las tres.
Algoritmos hash comunes
| Algoritmo | Bits de salida | Longitud | Estado | Usar para |
|---|---|---|---|---|
| MD5 | 128 | 32 hex | Roto (inseguro) | Sumas de comprobación heredadas, usos no de seguridad |
| SHA-1 | 160 | 40 hex | Roto (inseguro) | Sistemas heredados únicamente |
| SHA-224 | 224 | 56 hex | Seguro (de nicho) | Preferir SHA-256 |
| SHA-256 | 256 | 64 hex | Seguro | Integridad de archivo, firmas digitales |
| SHA-384 | 384 | 96 hex | Seguro | Suites de cifrado TLS 1.3 |
| SHA-512 | 512 | 128 hex | Seguro | Apps de alta seguridad, rendimiento en 64 bits |
| SHA3-256 | 256 | 64 hex | Seguro | Alternativa a prueba de futuro de SHA-256 |
| BLAKE2b / BLAKE3 | 256 o 512 | variable | Seguro, muy rápido | rsync, restic, hashing masivo |
| HMAC-SHA256 | 256 | 64 hex | Seguro | Firma de peticiones API |
| bcrypt | 184 | 60 car. (personalizados) | Seguro para contraseñas | Almacenamiento de contraseñas |
| Argon2id | configurable | variable | El mejor para contraseñas | Almacenamiento moderno de contraseñas |
| CRC32 | 32 | 8 hex | Solo detección de error | No es un hash de seguridad |
SHA-256 es el estándar actual para la mayoría de usos generales. MD5 y SHA-1 solo deberían usarse al interactuar con sistemas heredados que los requieran; nunca para límites de seguridad. Para contraseñas, usa bcrypt o Argon2id, no SHA-256 crudo.
Cómo generar un hash
- Elige tu algoritmo: selecciona MD5, SHA-1, SHA-256, SHA-384 o SHA-512 en el desplegable. Usa SHA-256 a menos que tengas una razón específica para elegir otro.
- Introduce texto o sube un archivo: escribe o pega texto en la caja de entrada, o arrastra un archivo. La herramienta ejecuta el hash enteramente en tu navegador usando la API Web Crypto.
- Copia el hash: el resultado es una cadena hex que puedes usar para verificación, almacenamiento o comparación. Muchas herramientas también ofrecen codificación base64 para almacenamiento compacto.
- Compara si es necesario: pega el hash publicado junto al hash generado y deja que la herramienta marque el primer carácter que difiera. Comparar cadenas de 64 caracteres a ojo es propenso a errores.
Usos prácticos
Verificación de integridad de archivo: descarga un archivo y compara su hash con el hash oficial del editor. Si coinciden, el archivo es auténtico y no está corrupto. Este es el caso de uso que motiva la mayoría de generaciones diarias de hash, el flujo detrás de cada invocación de sha256sum en Linux y cada página de checksums en una descarga de software.
Almacenamiento de contraseñas, las aplicaciones almacenan hashes de contraseñas, no las contraseñas mismas. Cuando inicias sesión, tu entrada se hashea y se compara con el hash almacenado. El detalle crucial es que el algoritmo debe ser lento a propósito (bcrypt, Argon2) para que un atacante que robe el archivo de hashes no pueda forzarlo en un tiempo razonable.
Deduplicación de datos: los sistemas de almacenamiento y herramientas de respaldo hashean trozos de datos, a menudo bloques de unos pocos megabytes, y usan el hash como clave. Se asume que dos trozos con el mismo hash son idénticos, así que la segunda ocurrencia solo guarda un puntero. Herramientas como restic, borg y muchos servicios de respaldo en la nube dependen de esto.
Firmas digitales: una firma digital es un hash cifrado con una clave privada. El verificador hashea el documento, descifra la firma con la clave pública, y comprueba que ambos coincidan. Esto prueba tanto que el documento no ha cambiado como que el firmante aprobó esta versión exacta.
HMAC para seguridad de API: HMAC combina una función hash con una clave secreta, produciendo una etiqueta que cualquiera con la misma clave puede verificar. Webhooks, firma de peticiones AWS, y muchas RPC internas usan HMAC-SHA256 para que el receptor sepa que la petición realmente vino de una fuente confiable.
Blockchain y árboles Merkle: las criptomonedas, el almacenamiento direccionable por contenido (IPFS), y Git usan todos árboles hash para comprometerse con grandes conjuntos de datos con un solo hash raíz. Cambia un byte en cualquier parte del árbol, y el hash raíz cambia, esa es la propiedad que hace los datos a prueba de manipulación.
Claves de caché: los sistemas de caché hashean URLs de petición o parámetros de consulta para producir una clave de búsqueda compacta. CRC y SipHash son comunes aquí porque priorizan velocidad sobre garantías criptográficas.
Hash vs HMAC vs firma digital
Estos tres conceptos se confunden a menudo porque todos producen cadenas hex de aspecto similar.
| Concepto | Entradas | Verifica | Uso común |
|---|---|---|---|
| Hash | Datos | Los datos no han cambiado desde que se calculó el hash | Sumas de comprobación, direccionamiento por contenido |
| HMAC | Datos + secreto compartido | Datos sin cambios Y creados por alguien con el secreto | Firma de peticiones API, webhooks |
| Firma digital | Datos + clave privada | Datos sin cambios Y firmados por una clave específica | Certificados TLS, firma de software |
| Cifrado | Datos + clave (cualquiera) | Los datos se mantuvieron secretos en tránsito | Confidencialidad (no integridad sola) |
Un hash crudo no prueba nada sobre quién lo creó. HMAC prueba que el emisor tenía el secreto compartido. Una firma identifica adicionalmente al firmante sin necesidad de compartir el secreto. Elige la herramienta más débil que resuelva tu problema real.
Errores comunes
- Usar MD5 o SHA-1 para seguridad, ambos están criptográficamente rotos. Pueden generarse colisiones en segundos (MD5) u horas en hardware cloud (SHA-1). Resérvalos estrictamente a sumas de comprobación no de seguridad.
- Hashear contraseñas con hashes de propósito general, el SHA-256 puro de una contraseña es lo bastante rápido como para que un atacante con una base robada pueda probar miles de millones de intentos por segundo en GPU. Usa bcrypt, scrypt o Argon2id en su lugar.
- Olvidar salar, dos usuarios con la misma contraseña nunca deberían producir el mismo hash almacenado. Salar (añadir bytes aleatorios a cada contraseña antes del hash) lo previene y detiene búsquedas en tablas arcoíris.
- Confiar en un hash servido desde el mismo lugar que el archivo, un atacante que comprometa un mirror de descarga puede cambiar tanto el archivo como su hash. Siempre que puedas, obtén el hash desde un dominio distinto o verifica una firma GPG sobre la lista de hashes.
- Confusión hex vs base64, el mismo hash se codifica como 64 caracteres hex o 44 caracteres base64. Comparar codificaciones distintas siempre fallará. Empareja la codificación antes de comparar.
- Comparar con
==en código de seguridad, la comparación de cadenas corta al primer carácter no coincidente, lo que filtra información de tiempo. Usa una función de comparación de tiempo constante en cualquier código que decida una autenticación. - Truncar un hash para ahorrar espacio, tomar solo los primeros 8 caracteres de SHA-256 reduce la resistencia a colisiones de astronómica a trivial. O almacena el hash completo o usa un hash diseñado para salidas cortas (SipHash).
- Usar un CRC para seguridad, CRC32 es genial para detectar corrupción accidental pero trivial de falsificar. Cualquiera puede añadir bytes para hacer que un CRC dé cualquier valor elegido.
- Re-hashear en vez de usar un PBKDF, hacer un bucle de SHA-256 diez mil veces a mano es el hash de contraseñas casero clásico; filtra temporización y es mucho más lento que las implementaciones bien auditadas de PBKDF2/bcrypt/Argon2.
- Almacenar el hash junto al sal con el mismo hash en cada login, un atacante que lea el hash y el sal solo tiene que romper una contraseña a la vez, pero si reutilizas un único sal global para todos los usuarios, una sola tabla arcoíris los rompe todos. Cada usuario recibe un sal aleatorio fresco.
Herramientas y bibliotecas alternativas
El generador de hash del navegador es el camino más rápido para hashes puntuales. Para uso repetido o scripts, las herramientas de línea de comandos y bibliotecas de lenguaje toman el relevo.
| Herramienta | Plataforma | Fortaleza | A tener en cuenta |
|---|---|---|---|
| Generador de hash web | Navegador | Instantáneo, sin instalación, sin subida | Una entrada a la vez |
sha256sum, md5sum | Linux | Scriptable, GNU coreutils | --check lee archivos SHA256SUMS |
shasum -a 256 | macOS, BSD | Incluido en el SO | Nombre de binario distinto al de Linux |
Get-FileHash | Windows PowerShell | De primera clase en Windows | Formato de salida difiere de sha256sum |
openssl dgst -sha256 | Multiplataforma | Si ya tienes OpenSSL | Más lento que herramientas dedicadas |
b3sum / BLAKE3 CLI | Multiplataforma | Rendimiento multi-GB/s | Más nuevo, menos omnipresente |
Python hashlib | Python | Incorporado, todos los algoritmos mayores | Quédate con entrada en bytes |
Node crypto | Node.js | Incorporado, API similar a Python | Streaming para archivos grandes |
Web Crypto subtle.digest | JS de navegador | Nativo, rápido, sin dependencias | Solo API asíncrona |
| HashiCorp Vault / KMS | Nube | Gestión centralizada de claves para HMAC y firma | Bloqueo de proveedor |
Para contraseñas, trata al ecosistema del lenguaje de forma distinta: usa bcrypt, argon2-cffi, passlib, o el adaptador recomendado por tu plataforma, nunca un bucle SHA artesanal.
Privacidad y el generador de hash
El generador de hash corre enteramente en tu navegador. El texto que escribes se hashea en memoria con la interfaz SubtleCrypto de Web Crypto, y cualquier archivo que selecciones se transmite por la API FileReader sin subida. No hay registro de qué entradas se hashearon, ni analítica sobre qué algoritmos son populares, ni manera de que nadie reconstruya lo que estabas verificando. Los hashes mismos a menudo resumen material sensible, contraseñas, documentos internos, claves privadas, exactamente el tipo de dato que nunca deberías pegar en un formulario web ajeno. Hacer el trabajo del lado del cliente mantiene la entrada en tu máquina, donde pertenece. Para una tarea tan rutinaria como generar una suma de comprobación, el ajuste de privacidad por defecto debería ser: nada sale de la página, nada se almacena, nada se comparte.
Preguntas frecuentes
¿Cuál es la diferencia entre MD5, SHA-1 y SHA-256?
MD5 produce un hash de 128 bits (32 caracteres hex), SHA-1 produce 160 bits (40 caracteres) y SHA-256 produce 256 bits (64 caracteres). MD5 y SHA-1 se consideran criptográficamente rotos. SHA-256 es actualmente seguro y se recomienda para la verificación de integridad y la seguridad.
¿Se puede invertir un hash para recuperar los datos originales?
No. Las funciones hash son de una sola dirección por diseño. No puedes invertir matemáticamente un hash hacia su entrada. En cambio, las contraseñas habituales pueden encontrarse en tablas precalculadas (rainbow tables), de ahí la importancia de salinizar las contraseñas antes del hashing.
¿Qué es HMAC?
HMAC (Hash-based Message Authentication Code) combina una función hash con una clave secreta. Verifica a la vez la integridad y la autenticidad de los datos, demostrando que no se han alterado y que los ha producido alguien que conoce la clave secreta.
¿Se envían mis datos a un servidor?
No. Todo el hashing se ejecuta en tu navegador con la API Web Crypto. Tus textos y archivos nunca salen de tu dispositivo.
Why should I never use MD5 or SHA-1 for password storage even with a salt?
Both algorithms are extremely fast, which is the opposite of what you want for passwords. An attacker with a stolen hash file can try billions of guesses per second on a GPU. Password-hashing functions like bcrypt, scrypt, and Argon2 are deliberately slow and memory-hard, which forces attackers to spend orders of magnitude more time per guess.
When should I use SHA-512 instead of SHA-256?
On 64-bit CPUs, SHA-512 is often slightly faster than SHA-256 because its inner state and word size are tuned to 64-bit operations. Use SHA-512 when you want a longer digest (128 hex characters) for collision resistance margin, or when you are already in a SHA-512 ecosystem (TLS 1.3 with certain cipher suites, some HMAC implementations).