Una función hash criptográfica toma una entrada de cualquier tamaño — una palabra, una oración, un archivo de varios gigabytes — y produce una salida de longitud fija llamada hash, digest o checksum. La misma entrada siempre produce la misma salida, pero es computacionalmente inviable reconstruir la entrada a partir de la salida, y un cambio ínfimo en la entrada produce un hash completamente diferente. Estas propiedades hacen que las funciones hash sean fundamentales para la verificación de integridad de datos, el almacenamiento de contraseñas, las firmas digitales y la identificación de archivos.
Las propiedades principales
- Resistencia a preimagen: Dado un hash H, es computacionalmente inviable encontrar cualquier entrada que produzca H. Esto hace que las funciones hash sean útiles para almacenar contraseñas.
- Resistencia a segunda preimagen: Dado un input M y su hash H(M), es inviable encontrar un M' diferente tal que H(M') = H(M). Esto evita que un atacante sustituya un documento diferente con el mismo hash.
- Resistencia a colisiones: Es computacionalmente inviable encontrar dos entradas distintas que produzcan el mismo hash. Cuando se pueden encontrar colisiones de forma eficiente, el algoritmo se considera roto para propósitos de seguridad.
MD5: roto para seguridad, útil para checksums
MD5 produce un hash de 128 bits, usualmente expresado como una cadena hexadecimal de 32 caracteres. Diseñado en 1991, hoy se considera criptográficamente roto — los investigadores demostraron ataques de colisión prácticos a mediados de los 2000, y una colisión puede calcularse en segundos en una laptop. MD5 es completamente inadecuado para aplicaciones de seguridad, pero sigue siendo útil para detectar corrupción accidental de archivos durante transferencias o almacenamiento, donde el modelo de atacante no aplica.
SHA-1: igualmente obsoleto
El ataque SHAttered de Google en 2017 demostró la primera colisión SHA-1 práctica — dos PDFs distintos con el mismo hash SHA-1. SHA-1 está deprecado por todos los principales organismos de estándares y no debe usarse para nuevas aplicaciones de seguridad.
SHA-256: el estándar actual
SHA-256 es parte de la familia SHA-2, produce un hash de 256 bits. No se han demostrado ataques prácticos contra SHA-256. Se usa en certificados TLS, el modelo de objetos de Git, la prueba de trabajo de Bitcoin y la mayoría de protocolos de seguridad modernos. Es la elección correcta para verificación de integridad, HMAC, firmas digitales e identificadores deterministas basados en contenido.
Nota importante: SHA-256 no es adecuado para hashing directo de contraseñas — es demasiado rápido. Una GPU moderna puede calcular miles de millones de hashes SHA-256 por segundo. Para contraseñas usa Argon2id, bcrypt o scrypt, que incorporan un costo computacional configurable.
BLAKE3: la alternativa moderna
BLAKE3 (lanzado en 2020) es dramáticamente más rápido que SHA-256 — a menudo 3–10x más rápido en software — mientras proporciona propiedades de seguridad equivalentes o más fuertes. También es paralelizable. Es excelente para hashing de archivos de alto rendimiento y sistemas de almacenamiento direccionado por contenido. Al ser más nuevo, tiene menos soporte de ecosistema que SHA-256 y no es aceptado en contextos que requieren cumplimiento FIPS.
Cómo elegir el algoritmo correcto
- Hashing de contraseñas: Argon2id o bcrypt (nunca SHA-anything)
- Integridad general de datos, ampliamente interoperable: SHA-256
- Hashing de alto rendimiento, herramientas modernas: BLAKE3
- Verificar transferencias no adversariales: MD5 o SHA-1 (por velocidad, no seguridad)
- Cumplimiento regulatorio/FIPS: SHA-256 o SHA-512